]> diplodocus.org Git - nmh/blobdiff - sbr/fmt_scan.c
Added test of encoded Resent-To: and Resent-cc:.
[nmh] / sbr / fmt_scan.c
index cb29b72cb1460cb669116ccfbc04b3b115e73f69..c5e9877cc47ae2827d9756395a06182022ec457b 100644 (file)
@@ -179,12 +179,12 @@ cptrimmed(charstring_t dest, char *str, int wid, char fill, size_t max)
             */
 
            if (char_len < 0) {
-               altstr = "?";
+               altstr = "?";
                char_len = mbtowc(&wide_char, altstr, 1);
            }
 
            if (char_len <= 0) {
-               break;
+               break;
            }
 
            w = wcwidth(wide_char);
@@ -247,9 +247,9 @@ static void
 cpstripped (charstring_t dest, size_t max, char *str)
 {
     static bool deja_vu;
-    static char *oddchar;
+    static char oddchar[MB_LEN_MAX * 2];
     static size_t oddlen;
-    static char *spacechar;
+    static char spacechar[MB_LEN_MAX * 2];
     static size_t spacelen;
     char *end;
     bool squash;
@@ -259,19 +259,12 @@ cpstripped (charstring_t dest, size_t max, char *str)
     int w;
 
     if (!deja_vu) {
-        size_t two;
-
         deja_vu = true;
 
-        two = MB_CUR_MAX * 2; /* Varies at run-time. */
-
-        oddchar = mh_xmalloc(two);
-        oddlen = wcstombs(oddchar, L"?", two);
+        oddlen = wcstombs(oddchar, L"?", sizeof oddchar);
         assert(oddlen > 0);
-
         assert(wcwidth(L' ') == 1); /* Need to pad in ones. */
-        spacechar = mh_xmalloc(two);
-        spacelen = wcstombs(spacechar, L" ", two);
+        spacelen = wcstombs(spacechar, L" ", sizeof spacechar);
         assert(spacelen > 0);
     }
 
@@ -583,6 +576,34 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat,
                str = buffer;
            }
            break;
+       case FT_LS_ORDINAL:
+           {
+               int digit = value % 10;
+               int seconddigit = (value / 10) % 10;
+               const char *suffix;
+
+               if (seconddigit == 1) {
+                   suffix = "th";
+               } else {
+                   switch (digit) {
+                   case 1:
+                       suffix = "st";
+                       break;
+                   case 2:
+                       suffix = "nd";
+                       break;
+                   case 3:
+                       suffix = "rd";
+                       break;
+                   default:
+                       suffix = "th";
+                   }
+               }
+
+               strncpy(buffer, suffix, sizeof(buffer));
+               str = buffer;
+           }
+           break;
        case FT_NUMF:
            cpnumber (scanlp, value, fmt->f_width, fmt->f_fill,
                      max - charstring_chars (scanlp));
@@ -943,15 +964,15 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat,
                    buffer[sizeof(buffer)-1] = '\0';
                    str = buffer;
                    if (*str == '(')
-                       str++;
+                       str++;
                    sp = str + strlen(str) - 1;
                    if (*sp == ')') {
-                       *sp-- = '\0';
-                       while (sp >= str)
-                           if (*sp == ' ')
-                               *sp-- = '\0';
-                           else
-                               break;
+                       *sp-- = '\0';
+                       while (sp >= str)
+                           if (*sp == ' ')
+                               *sp-- = '\0';
+                           else
+                               break;
                    }
                     str = memmove(buffer, str, strlen(str) + 1);
                } else if (!(str = get_x400_friendly (mn->m_mbox,
@@ -983,7 +1004,7 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat,
 
                /* UNQUOTEs RFC-2822 quoted-string and quoted-pair */
        case FT_LS_UNQUOTE:
-           if (str) {          
+           if (str) {
                if (str != buffer)
                    strncpy(buffer, str, sizeof(buffer));
                /* strncpy doesn't NUL-terminate if it fills the buffer */
@@ -1057,7 +1078,7 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat,
            indent = strlen (sp);
            wid -= indent;
            if (wid <= 0) {
-               die("putaddr -- num register (%d) must be greater "
+               die("putaddr -- num register (%d) must be greater "
                            "than label width (%d)", value, indent);
            }
            while ((c = *sp++) && charstring_chars (scanlp) < max) {
@@ -1155,7 +1176,11 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat,
                               comp->c_mn will be run through
                               FT_LS_ADDR, which will strip off any
                               pers name. */
-                           free (comp->c_text);
+                           /* NB: We remove the call to free() here
+                              because it interferes with the buffer
+                              management in scansbr.c.  Revisit this
+                              when we clean up memory handling */
+                           /* free (comp->c_text); */
                            comp->c_text = str = strdup (mn->m_text);
                            comp->c_mn = mn;
                        }