X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffmt_scan.c;h=2485e6cbfc7b159fc18ab6b0040741002a0870c9;hp=f26b02bbb2eb226f3db5ac548447c736eb88baa7;hb=31750e8a12eafcd1b8fa81cb12b988e680254f24;hpb=83e04675b53374a1436029a367283d6d4ee05a07 diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index f26b02b..2485e6c 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -4,6 +4,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 @@ -11,26 +14,19 @@ #include #include #include +#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 */ - extern int fmt_norm; /* defined in sbr/fmt_def.c = AD_NAME */ struct mailname fmt_mnull; @@ -40,6 +36,7 @@ struct mailname fmt_mnull; static int match(char *, char *); static char *get_x400_friendly(char *, char *, int); static int get_x400_comp(char *, char *, char *, int); +static char *fmt_trim(char *, int); /* @@ -263,6 +260,39 @@ get_x400_comp(char *mbox, char *key, char *buffer, int buffer_len) return 1; } +static char * +fmt_trim(char *str, int width) +{ + char *xp; + int ljust, i; + char buffer[BUFSIZ]; + + strncpy(buffer, str, sizeof(buffer)); + buffer[sizeof(buffer)-1] = '\0'; + str = buffer; + while (isspace(*str)) { + str++; + } + ljust = 0; + if ((i = width) < 0) { + i = -i; + ljust++; + } + + 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 && (int)strlen(str) > i) { + str += strlen(str) - i; + } + return str; +} + struct format * fmt_scan(struct format *format, char *scanl, int width, int *dat) { @@ -328,7 +358,7 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat) cptrimmed(&cp, str, fmt->f_width, fmt->f_fill, ep - cp); break; case FT_STRFW: - adios(NULL, "internal error (FT_STRFW)"); + adios(EX_SOFTWARE, NULL, "internal error (FT_STRFW)"); case FT_NUM: n = snprintf(cp, ep - cp + 1, "%d", value); @@ -466,27 +496,7 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat) case FT_LS_TRIM: if (str) { - unsigned char *xp; - - strncpy(buffer, str, sizeof(buffer)); - buffer[sizeof(buffer)-1] = '\0'; - str = buffer; - while (isspace(*str)) - str++; - ljust = 0; - if ((i = fmt->f_width) < 0) { - i = -i; - ljust++; - } - - if (!ljust && i > 0 && 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) - str += strlen(str) - i; + str = fmt_trim(str, fmt->f_width); } break; @@ -611,10 +621,8 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat) value = fmt->f_comp->c_tws->tw_flags & TW_DST; break; case FT_LS_822DATE: - str = dasctime(fmt->f_comp->c_tws , TW_ZONE); - break; case FT_LS_PRETTY: - str = dasctime(fmt->f_comp->c_tws, TW_NULL); + str = dasctime(fmt->f_comp->c_tws); break; case FT_LS_PERS: @@ -685,7 +693,7 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat) } else str = mn->m_text; break; - } + } } } break; @@ -694,32 +702,10 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat) /* UNQUOTEs RFC-2822 quoted-string and quoted-pair */ case FT_LS_UNQUOTE: if (str) { - int m; strncpy(buffer, str, sizeof(buffer)); /* strncpy doesn't NUL-terminate if it fills the buffer */ buffer[sizeof(buffer)-1] = '\0'; - str = buffer; - - /* we will parse from buffer to buffer2 */ - n = 0; /* n is the input position in str */ - m = 0; /* m is the ouput position in buffer2 */ - - while ( str[n] != '\0') { - switch ( str[n] ) { - case '\\': - n++; - if ( str[n] != '\0') - buffer2[m++] = str[n++]; - break; - case '"': - n++; - break; - default: - buffer2[m++] = str[n++]; - break; - } - } - buffer2[m] = '\0'; + unquote_string(buffer, buffer2); str = buffer2; } break; @@ -781,12 +767,18 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat) sp = fmt->f_text; indent = strlen(sp); wid -= indent; + if (wid <= 0) { + adios(EX_SOFTWARE, NULL, "putaddr -- num register (%d) " + "must be greater than label " + "width (%d)", value, indent); + } while( (c = *sp++) && cp < ep) *cp++ = c; while (len > wid) { - /* try to break at a comma; failing that, - * break at a space. - */ + /* + ** try to break at a comma; failing that, + ** break at a space. + */ lastb = 0; sp = lp + wid; while (sp > lp && (c = *--sp) != ',') { if (! lastb && isspace(c)) @@ -868,6 +860,20 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat) } break; + case FT_LS_UNMAILTO: + if (!str) { + break; + } + str = trim(str); + if (*str == '<' && str[strlen(str)-1] == '>') { + str++; + str[strlen(str)-1] = '\0'; + } + if (strncmp("mailto:", str, 7)==0) { + str += 7; + } + break; + } fmt++; } @@ -876,17 +882,4 @@ finished:; *cp++ = '\n'; *cp = '\0'; return ((struct format *)0); - -#ifdef JLR - /* I'll remove this as soon as I understand what it does. --meillo */ - if (cp[-1] != '\n') - *cp++ = '\n'; - while (fmt->f_type != FT_DONE) - fmt++; - - finished:; - *cp = '\0'; - return (fmt->f_value ? ++fmt : (struct format *) 0); -#endif /* JLR */ - }