X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Ffmt_scan.c;h=29b87d02713d18cf26b2f0c0250150429210adee;hb=2b1cd09eae8aa7516f8d47a6ee80e92cba714224;hp=8d0383608c03053b66e24d615526d791de6c259e;hpb=648c015ca70b15edf41d80aa87314ade3252d140;p=mmh diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 8d03836..29b87d0 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -5,6 +5,9 @@ * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for * complete copyright information. + * + * This is the engine that processes the format instructions created by + * fmt_compile (found in fmt_compile.c). */ #include @@ -13,31 +16,22 @@ #include #include -#ifdef TIME_WITH_SYS_TIME +#ifdef HAVE_SYS_TIME_H # include -# include -#else -# ifdef TM_IN_SYS_TIME -# include -# else -# include -# endif #endif +#include #ifdef MULTIBYTE_SUPPORT # include # include #endif -#define NFMTS MAXARGS - -extern char *formataddr (); /* hook for custom address formatting */ - #ifdef LBL struct msgs *fmt_current_folder; /* current folder (set by main program) */ #endif extern int fmt_norm; /* defined in sbr/fmt_def.c = AD_NAME */ -struct mailname fmt_mnull; +struct mailname fmt_mnull = { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, + NULL, NULL }; /* * static prototypes @@ -159,7 +153,10 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) { sp += char_len; #else end--; - if (iscntrl(*sp) || isspace(*sp)) { + /* isnctrl(), etc., take an int argument. Cygwin's ctype.h + intentionally warns if they are passed a char. */ + int c = *sp; + if (iscntrl(c) || isspace(c)) { sp++; #endif if (!prevCtrl) { @@ -355,6 +352,11 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) case FT_STRF: cptrimmed (&cp, str, fmt->f_width, fmt->f_fill, ep - cp); break; + case FT_STRLIT: + sp = str; + while ((c = *sp++) && cp < ep) + *cp++ = c; + break; case FT_STRFW: adios (NULL, "internal error (FT_STRFW)"); @@ -507,13 +509,13 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) ljust++; } - if (!ljust && i > 0 && strlen(str) > i) + if (!ljust && i > 0 && (int) strlen(str) > i) str[i] = '\0'; xp = str; xp += strlen(str) - 1; while (xp > str && isspace(*xp)) *xp-- = '\0'; - if (ljust && i > 0 && strlen(str) > i) + if (ljust && i > 0 && (int) strlen(str) > i) str += strlen(str) - i; } break; @@ -794,6 +796,11 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) str = formataddr (savestr, str); break; + case FT_CONCATADDR: + /* The same as formataddr, but doesn't do duplicate suppression */ + str = concataddr (savestr, str); + break; + case FT_PUTADDR: /* output the str register as an address component, * splitting it into multiple lines if necessary. The @@ -812,6 +819,10 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) sp = fmt->f_text; indent = strlen (sp); wid -= indent; + if (wid <= 0) { + adios(NULL, "putaddr -- num register (%d) must be greater " + "than label width (%d)", value, indent); + } while( (c = *sp++) && cp < ep) *cp++ = c; while (len > wid) {