X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/bf982b40ca8495e7a8d14513aedcc2fe15f09a93..34f0ab116ad7734e96127d3cd046861a5c82c11c:/sbr/fmt_compile.c diff --git a/sbr/fmt_compile.c b/sbr/fmt_compile.c index 3f3db644..84ef5983 100644 --- a/sbr/fmt_compile.c +++ b/sbr/fmt_compile.c @@ -177,6 +177,7 @@ static struct ftable functable[] = { { "localmbox", TF_LMBOX, FT_LS_LIT, 0, TFL_PUTS }, { "plus", TF_NUM, FT_LV_PLUS_L, 0, TFL_PUTN }, { "minus", TF_NUM, FT_LV_MINUS_L, 0, TFL_PUTN }, + { "multiply", TF_NUM, FT_LV_MULTIPLY_L, 0, TFL_PUTN }, { "divide", TF_NUM, FT_LV_DIVIDE_L, 0, TFL_PUTN }, { "modulo", TF_NUM, FT_LV_MODULO_L, 0, TFL_PUTN }, { "charleft", TF_NONE, FT_LV_CHAR_LEFT, 0, TFL_PUTN }, @@ -223,7 +224,8 @@ static struct ftable functable[] = { { "friendly", TF_COMP, FT_LS_FRIENDLY, FT_PARSEADDR, TFL_PUTS }, { "mymbox", TF_COMP, FT_LV_COMPFLAG, FT_MYMBOX, TFL_PUTN }, - { "getmymbox", TF_COMP, FT_LS_ADDR, FT_GETMYMBOX, TFL_PUTS }, + { "getmymbox", TF_COMP, FT_STR, FT_GETMYMBOX, 0 }, + { "getmyaddr", TF_COMP, FT_LS_ADDR, FT_GETMYADDR, TFL_PUTS }, { "unquote", TF_EXPR, FT_LS_UNQUOTE, 0, TFL_PUTS }, @@ -266,13 +268,15 @@ static struct colormap colortable[] = { { NULL, 0, 0 } }; -/* - * Hash function for component name. The function should be - * case independent and probably shouldn't involve a routine - * call. This function is pretty good but will not work on - * single character component names. - */ -#define CHASH(nm) (((((nm)[0]) - ((nm)[1])) & 0x1f) + (((nm)[2]) & 0x5f)) +/* Hash function for component name. Deliberately avoids a function + * call. Is case independent. Covers interval [0, 126] so never uses + * the last element of wantcomp[]. This function is "pretty good". */ +#define CHASH(nm) ( \ + (( \ + ((nm)[0]) - ((nm)[0] ? ((nm)[1]) : 0) \ + ) & 0x1f) + \ + ((nm[1]) ? (((nm)[2]) & 0x5f) : 0) \ + ) /* * Find a component in the hash table. @@ -397,8 +401,6 @@ fmt_compile(char *fstring, struct format **fmt, int reset_comptable) comptable_initialized = 1; } - memset((char *) &fmt_mnull, 0, sizeof(fmt_mnull)); - /* it takes at least 4 char to generate one format so we * allocate a worst-case format array using 1/4 the length * of the format string. We actually need twice this much @@ -407,11 +409,7 @@ fmt_compile(char *fstring, struct format **fmt, int reset_comptable) */ i = strlen(fstring)/2 + 1; if (i==1) i++; - next_fp = formatvec = (struct format *)mh_xcalloc ((size_t) i, - sizeof(struct format)); - if (next_fp == NULL) - adios (NULL, "unable to allocate format storage"); - + next_fp = formatvec = mh_xcalloc(i, sizeof *next_fp); infunction = 0; cp = compile(format_string); @@ -575,6 +573,7 @@ do_name(char *sp, int preprocess) case FT_MYMBOX: case FT_GETMYMBOX: + case FT_GETMYADDR: if (!primed) { ismymbox ((struct mailname *) 0); primed++;