X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffmt_scan.c;h=8f81e77a3f7f9ea1c00b379365909ea426c11156;hp=678153513238df3e00917200d4220586748a2b85;hb=6630f05d0a6d631c9ed2edfef9951df892287794;hpb=c065080384e524f3afbae781492464f4661a55df diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 6781535..8f81e77 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -88,6 +88,25 @@ match (char *str, char *sub) /* * macros to format data */ +#define PUTDF(cp, num, wid, fill)\ + if (cp + wid < ep) {\ + if ((i = (num)) < 0)\ + i = -(num);\ + if ((c = (wid)) < 0)\ + c = -c;\ + sp = cp + c;\ + do {\ + *--sp = (i % 10) + '0';\ + i /= 10;\ + } while (i > 0 && sp > cp);\ + if (i > 0)\ + *sp = '?';\ + else if ((num) < 0 && sp > cp)\ + *--sp = '-';\ + while (sp > cp)\ + *--sp = fill;\ + cp += c;\ + } #ifdef LOCALE #define PUTSF(cp, str, wid, fill) {\ @@ -111,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)))\ @@ -129,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)))\ @@ -310,12 +329,7 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) if (n >= 0) cp += n; break; case FT_NUMF: - n = snprintf(cp, ep - cp, "%d", value); - if (n >= 0) { - cp += n; - } else n = 0; - c = abs(fmt->f_width) - n; - for (; c && cp < ep; c--) *cp++ = fmt->f_fill; + PUTDF (cp, value, fmt->f_width, fmt->f_fill); break; case FT_CHAR: @@ -428,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; @@ -444,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++; @@ -632,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++; @@ -668,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: