]> diplodocus.org Git - nmh/blobdiff - sbr/fmt_scan.c
Always check that mktemp()/mktemp2() succeeds before trying to
[nmh] / sbr / fmt_scan.c
index d0bb16dfc1053eb235c44d5648c8d50d1b6a139d..9b84861cb123b25f5e4cbc71e2e3494caa33f6c1 100644 (file)
@@ -25,7 +25,6 @@
 #  include <wchar.h>
 #endif
 
-extern int fmt_norm;           /* defined in sbr/fmt_def.c = AD_NAME */
 struct mailname fmt_mnull = { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0,
                              NULL, NULL };
 
@@ -176,11 +175,11 @@ cptrimmed(char **dest, char **ep, char *str, unsigned int wid, char fill,
             * widths, so use the column width to bump the end pointer when
             * appropriate.
             */
-           if (char_len > 1 && epmax - *ep >= char_len - w) {
+           if (w >= 0  &&  char_len > 1 && epmax - *ep >= char_len - w) {
                *ep += char_len - w;
            }
 
-           if (cp + w > *ep)
+           if (w >= 0  &&  cp + w > *ep)
                break;
 
            end -= char_len;
@@ -279,7 +278,7 @@ cpstripped (char **dest, char **end, char *max, char *str)
         * by the number of "extra" bytes in this character.  That's the
         * character length (char_len) minus the column width (w).
         */
-       if (char_len > 1  &&  max - *end >= char_len - w) {
+       if (w >= 0  &&  char_len > 1  &&  max - *end >= char_len - w) {
            *end += char_len - w;
        }
 
@@ -468,29 +467,31 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
                       scanl + max - 1);
            break;
        case FT_STRLIT:
-           sp = str;
-           while ((c = *sp++) && cp < ep)
-               *cp++ = c;
+           if (str) {
+               sp = str;
+               while ((c = *sp++) && cp < ep)
+                   *cp++ = c;
+           }
            break;
-       case FT_STRLITZ: {
-           size_t len = strlen (str);
-
-           /* Don't want to emit part of an escape sequence.  So if
-              there isn't enough room in the buffer for the entire
-              string, skip it completely. */
-           if (cp - scanl + len + 1 < max) {
-               for (sp = str; *sp; *cp++ = *sp++) continue;
-
-               /* This string doesn't count against the width.  So
-                  increase ep the same amount as cp, only if the
-                  scan buffer will always be large enough. */
-               if (ep - scanl + len + 1 < max) {
-                   ep += len;
+       case FT_STRLITZ:
+           if (str) {
+               size_t len = strlen (str);
+
+               /* Don't want to emit part of an escape sequence.  So if
+                  there isn't enough room in the buffer for the entire
+                  string, skip it completely. */
+               if (cp - scanl + len + 1 < max) {
+                   for (sp = str; *sp; *cp++ = *sp++) continue;
+
+                   /* This string doesn't count against the width.
+                      So increase ep the same amount as cp, only if the
+                      scan buffer will always be large enough. */
+                   if (ep - scanl + len + 1 < max) {
+                       ep += len;
+                   }
                }
            }
-
            break;
-       }
        case FT_STRFW:
            adios (NULL, "internal error (FT_STRFW)");
 
@@ -519,6 +520,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
 
        case FT_IF_S:
            if (!(value = (str && *str))) {
+               if (callbacks && callbacks->trace_func)
+                   callbacks->trace_func(callbacks->trace_context, fmt, value,
+                                         str, scanl);
                fmt += fmt->f_skip;
                continue;
            }
@@ -526,6 +530,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
 
        case FT_IF_S_NULL:
            if (!(value = (str == NULL || *str == 0))) {
+               if (callbacks && callbacks->trace_func)
+                   callbacks->trace_func(callbacks->trace_context, fmt, value,
+                                         str, scanl);
                fmt += fmt->f_skip;
                continue;
            }
@@ -533,6 +540,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
 
        case FT_IF_V_EQ:
            if (value != fmt->f_value) {
+               if (callbacks && callbacks->trace_func)
+                   callbacks->trace_func(callbacks->trace_context, fmt, value,
+                                         str, scanl);
                fmt += fmt->f_skip;
                continue;
            }
@@ -540,6 +550,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
 
        case FT_IF_V_NE:
            if (value == fmt->f_value) {
+               if (callbacks && callbacks->trace_func)
+                   callbacks->trace_func(callbacks->trace_context, fmt, value,
+                                         str, scanl);
                fmt += fmt->f_skip;
                continue;
            }
@@ -547,6 +560,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
 
        case FT_IF_V_GT:
            if (value <= fmt->f_value) {
+               if (callbacks && callbacks->trace_func)
+                   callbacks->trace_func(callbacks->trace_context, fmt, value,
+                                         str, scanl);
                fmt += fmt->f_skip;
                continue;
            }
@@ -554,6 +570,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
 
        case FT_IF_MATCH:
            if (!(value = (str && match (str, fmt->f_text)))) {
+               if (callbacks && callbacks->trace_func)
+                   callbacks->trace_func(callbacks->trace_context, fmt, value,
+                                         str, scanl);
                fmt += fmt->f_skip;
                continue;
            }
@@ -568,6 +587,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
 
        case FT_IF_AMATCH:
            if (!(value = (str && uprf (str, fmt->f_text)))) {
+               if (callbacks && callbacks->trace_func)
+                   callbacks->trace_func(callbacks->trace_context, fmt, value,
+                                         str, scanl);
                fmt += fmt->f_skip;
                continue;
            }
@@ -598,6 +620,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
            break;
 
        case FT_GOTO:
+           if (callbacks && callbacks->trace_func)
+               callbacks->trace_func(callbacks->trace_context, fmt, value,
+                                     str, scanl);
            fmt += fmt->f_skip;
            continue;
 
@@ -868,32 +893,10 @@ fmt_scan (struct format *format, char *scanl, size_t max, 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;
@@ -1009,7 +1012,7 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
            if (comp->c_mn != &fmt_mnull)
                mnfree (comp->c_mn);
            if ((sp = comp->c_text) && (sp = getname(sp)) &&
-               (mn = getm (sp, NULL, 0, fmt_norm, NULL))) {
+               (mn = getm (sp, NULL, 0, NULL, 0))) {
                comp->c_mn = mn;
                while (getname(""))
                    ;
@@ -1031,7 +1034,7 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
            if (comp->c_mn != &fmt_mnull)
                mnfree (comp->c_mn);
            if ((sp = comp->c_text) && (sp = getname(sp)) &&
-               (mn = getm (sp, NULL, 0, AD_NAME, NULL))) {
+               (mn = getm (sp, NULL, 0, NULL, 0))) {
                comp->c_mn = mn;
                if (ismymbox(mn))
                    comp->c_flags |= CF_TRUE;
@@ -1039,7 +1042,7 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
                    comp->c_flags &= ~CF_TRUE;
                while ((sp = getname(sp)))
                    if ((comp->c_flags & CF_TRUE) == 0 &&
-                       (mn = getm (sp, NULL, 0, AD_NAME, NULL)))
+                       (mn = getm (sp, NULL, 0, NULL, 0)))
                        if (ismymbox(mn))
                            comp->c_flags |= CF_TRUE;
            } else {
@@ -1076,7 +1079,7 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
               there isn't enough room in the buffer for the entire
               string, skip it completely.  Need room for null
               terminator, and maybe trailing newline (added below). */
-           if (cp - scanl + strlen (str) + 1 < max) {
+           if (str && (cp - scanl + strlen (str) + 1 < max)) {
                for (sp = str; *sp; *cp++ = *sp++) continue;
            }
            if (callbacks && callbacks->trace_func)