* 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);
/*
*/
if (char_len < 0) {
- altstr = "?";
+ altstr = "?";
char_len = mbtowc(&wide_char, altstr, 1);
}
if (char_len <= 0) {
- break;
+ break;
}
w = wcwidth(wide_char);
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;
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);
}
"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)
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));
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:
/* 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 */
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) {
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;
}