X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/5bc2777230cdc4cea23ff87df356af3fb0cfadf9..fc5bc39368b0c7e05bb5c62a84c44e3bdcbbb1c2:/sbr/fmt_scan.c diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index cb29b72c..f0803d25 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -39,8 +39,6 @@ struct mailname fmt_mnull = { NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, * static prototypes */ static int match (char *, char *) PURE; -static char *get_x400_friendly (char *, char *, int); -static int get_x400_comp (char *, char *, char *, int); /* @@ -179,12 +177,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 +245,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 +257,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); } @@ -364,50 +355,6 @@ static char *lmonth[] = { "January", "February","March", "April", "May", "June", "July", "August", "September","October", "November","December" }; -static char * -get_x400_friendly (char *mbox, char *buffer, int buffer_len) -{ - char given[BUFSIZ], surname[BUFSIZ]; - - if (mbox == NULL) - return NULL; - if (*mbox == '"') - mbox++; - if (*mbox != '/') - return NULL; - - if (get_x400_comp (mbox, "/PN=", buffer, buffer_len)) { - for (mbox = buffer; (mbox = strchr(mbox, '.')); ) - *mbox++ = ' '; - - return buffer; - } - - if (!get_x400_comp (mbox, "/S=", surname, sizeof(surname))) - return NULL; - - if (get_x400_comp (mbox, "/G=", given, sizeof(given))) - snprintf (buffer, buffer_len, "%s %s", given, surname); - else - snprintf (buffer, buffer_len, "%s", surname); - - return buffer; -} - -static int -get_x400_comp (char *mbox, char *key, char *buffer, int buffer_len) -{ - int idx; - char *cp; - - if ((idx = stringdex (key, mbox)) < 0 - || !(cp = strchr(mbox += idx + strlen (key), '/'))) - return 0; - - snprintf (buffer, buffer_len, "%*.*s", (int)(cp - mbox), (int)(cp - mbox), mbox); - return 1; -} - struct format * fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, struct fmt_callbacks *callbacks) @@ -583,6 +530,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,19 +918,18 @@ 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, - buffer, sizeof(buffer)))) { + } else { unfriendly: switch (mn->m_type) { case LOCALHOST: @@ -983,7 +957,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 +1031,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 +1129,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; }