]> diplodocus.org Git - nmh/blobdiff - sbr/fmt_scan.c
mhlist: don't truncate anything when -verbose
[nmh] / sbr / fmt_scan.c
index a7ad1249068b8193150fd08ceb5174b3ceebc740..ec94897eccfa566009ff707a659dc77e94ee7500 100644 (file)
@@ -47,7 +47,6 @@ match (char *str, char *sub)
     int c1, c2;
     char *s1, *s2;
 
-#ifdef LOCALE
     while ((c1 = *sub)) {
        c1 = (isascii((unsigned char) c1) && isalpha((unsigned char) c1) &&
              isupper((unsigned char) c1)) ? tolower((unsigned char) c1) : c1;
@@ -71,19 +70,6 @@ match (char *str, char *sub)
        if (! c1)
            return 1;
     }
-#else
-    while ((c1 = *sub)) {
-       while ((c2 = *str++) && (c1 | 040) != (c2 | 040))
-           ;
-       if (! c2)
-           return 0;
-       s1 = sub + 1; s2 = str;
-       while ((c1 = *s1++) && (c1 | 040) == (*s2++ | 040))
-           ;
-       if (! c1)
-           return 1;
-    }
-#endif
     return 1;
 }
 
@@ -175,11 +161,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;
@@ -278,7 +264,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;
        }
 
@@ -467,29 +453,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)");
 
@@ -502,6 +490,55 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat,
                    cp += n;
            }
            break;
+       case FT_LS_KILO:
+       case FT_LS_KIBI:
+           {
+               char *unitcp;
+               unsigned int whole, tenths;
+               unsigned int scale;
+               unsigned int val = (unsigned int)value;
+               char *kibisuff;
+
+               switch (fmt->f_type) {
+               case FT_LS_KILO: scale = 1000; kibisuff = ""; break;
+               case FT_LS_KIBI: scale = 1024; kibisuff = "i"; break;
+               }
+
+               if (val < scale) {
+                   snprintf(buffer, sizeof(buffer), "%u", val);
+               } else {
+
+                   /* find correct scale for size (Kilo/Mega/Giga/Tera) */
+                   for (unitcp = "KMGT"; val > (scale * scale); val /= scale) {
+                       if (!*++unitcp)
+                           break;
+                   }
+
+                   if (!*unitcp) {
+                       strcpy(buffer, "huge");
+                   } else {
+                       /* val is scale times too big.  we want tenths */
+                       val *= 10;
+
+                       /* round up */
+                       val += (scale - 1);
+                       val /= scale;
+
+                       whole = val / 10;
+                       tenths = val - (whole * 10);
+
+                       if (tenths) {
+                           snprintf(buffer, sizeof(buffer), "%u.%u%c%s",
+                                   whole, tenths, *unitcp, kibisuff);
+                       } else {
+                           snprintf(buffer, sizeof(buffer), "%u%c%s",
+                                   whole, *unitcp, kibisuff);
+                       }
+                   }
+               }
+               str = buffer;
+           }
+           break;
        case FT_NUMF:
            cpnumber (&cp, value, fmt->f_width, fmt->f_fill, ep - cp);
            break;
@@ -518,6 +555,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;
            }
@@ -525,6 +565,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;
            }
@@ -532,6 +575,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;
            }
@@ -539,6 +585,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;
            }
@@ -546,6 +595,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;
            }
@@ -553,6 +605,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;
            }
@@ -567,6 +622,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;
            }
@@ -597,6 +655,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;
 
@@ -1053,7 +1114,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)