X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffmt_scan.c;h=8f81e77a3f7f9ea1c00b379365909ea426c11156;hp=4f79bf6a4964a6eb3b9a05505e815571c7cf3e12;hb=6630f05d0a6d631c9ed2edfef9951df892287794;hpb=0e02bd46c1b4931073f3e865bbad4deb15691fd7 diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 4f79bf6..8f81e77 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -88,7 +88,6 @@ match (char *str, char *sub) /* * macros to format data */ - #define PUTDF(cp, num, wid, fill)\ if (cp + wid < ep) {\ if ((i = (num)) < 0)\ @@ -109,26 +108,6 @@ match (char *str, char *sub) cp += c;\ } -#define PUTD(cp, num)\ - if (cp < ep) {\ - if ((i = (num)) == 0)\ - *cp++ = '0';\ - else {\ - if ((i = (num)) < 0) {\ - *cp++ = '-';\ - i = -(num);\ - }\ - c = 10;\ - while (c <= i) \ - c *= 10;\ - while (cp < ep && c > 1) {\ - c /= 10;\ - *cp++ = (i / c) + '0';\ - i %= c;\ - }\ - }\ - } - #ifdef LOCALE #define PUTSF(cp, str, wid, fill) {\ ljust = 0;\ @@ -151,7 +130,7 @@ match (char *str, char *sub) sp++;\ }\ while ((c = (unsigned char) *sp++) && --i >= 0 && cp < ep)\ - if (isgraph(c)) \ + if (!iscntrl(c) && !isspace(c)) \ *cp++ = c;\ else {\ while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ @@ -169,7 +148,7 @@ match (char *str, char *sub) while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ sp++;\ while((c = (unsigned char) *sp++) && cp < ep)\ - if (isgraph(c)) \ + if (!iscntrl(c) && !isspace(c)) \ *cp++ = c;\ else {\ while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ @@ -286,7 +265,7 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) char *cp, *ep, *sp; char *savestr, *str = NULL; char buffer[BUFSIZ], buffer2[BUFSIZ]; - int i, c, ljust; + int i, c, ljust, n; int value = 0; time_t t; struct format *fmt; @@ -346,7 +325,8 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) adios (NULL, "internal error (FT_STRFW)"); case FT_NUM: - PUTD (cp, value); + n = snprintf(cp, ep - cp, "%d", value); + if (n >= 0) cp += n; break; case FT_NUMF: PUTDF (cp, value, fmt->f_width, fmt->f_fill); @@ -462,14 +442,14 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) break; case FT_LS_DECODECOMP: - if (decode_rfc2047(fmt->f_comp->c_text, buffer2)) + if (decode_rfc2047(fmt->f_comp->c_text, buffer2, sizeof(buffer2))) str = buffer2; else str = fmt->f_comp->c_text; break; case FT_LS_DECODE: - if (str && decode_rfc2047(str, buffer2)) + if (str && decode_rfc2047(str, buffer2, sizeof(buffer2))) str = buffer2; break; @@ -478,6 +458,7 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) char *xp; strncpy(buffer, str, sizeof(buffer)); + buffer[sizeof(buffer)-1] = '\0'; str = buffer; while (isspace(*str)) str++; @@ -666,6 +647,7 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) if ((str = mn->m_pers) == NULL) { if ((str = mn->m_note)) { strncpy (buffer, str, sizeof(buffer)); + buffer[sizeof(buffer)-1] = '\0'; str = buffer; if (*str == '(') str++; @@ -702,6 +684,40 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) } } } + break; + + + /* 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'; + str = buffer2; + } break; case FT_LOCALDATE: