char *s1, *s2;
while ((c1 = *sub)) {
- c1 = (isascii((unsigned char) c1) && isalpha((unsigned char) c1) &&
- isupper((unsigned char) c1)) ? tolower((unsigned char) c1) : c1;
- while ((c2 = *str++) && c1 != ((isascii((unsigned char) c2) &&
- isalpha((unsigned char) c2) &&
- isupper((unsigned char) c2)) ?
- tolower((unsigned char) c2) : c2))
+ c1 = tolower((unsigned char)c1);
+ while ((c2 = *str++) && c1 != tolower((unsigned char)c2))
;
if (! c2)
return 0;
s1 = sub + 1; s2 = str;
- while ((c1 = *s1++) && ((isascii((unsigned char) c1) &&
- isalpha((unsigned char) c1) &&
- isupper((unsigned char) c1)) ?
- tolower(c1) : c1) ==
- ((isascii((unsigned char) (c2 =*s2++)) &&
- isalpha((unsigned char) c2) &&
- isupper((unsigned char) c2)) ?
- tolower((unsigned char) c2) : c2))
+ while ((c1 = *s1++) &&
+ tolower((unsigned char)c1) == tolower((unsigned char)(c2 = *s2++)))
;
if (! c1)
return 1;
charstring_push_back (rev, '?');
} else if (num < 0 && wid > 0) {
/* Shouldn't need the wid > 0 check, that's why the condition
- at the top checks wid < max-1 when num < 0. */
- charstring_push_back (rev, '-');
+ at the top checks wid < max-1 when num < 0. */
--wid;
+ if (fill == ' ') {
+ charstring_push_back (rev, '-');
+ }
}
while (wid-- > 0 && fill != 0) {
charstring_push_back (rev, fill);
}
+ if (num < 0 && fill == '0') {
+ charstring_push_back (rev, '-');
+ }
{
/* Output the string in reverse. */
{
char *sp;
char *savestr, *str;
- char buffer[BUFSIZ], buffer2[BUFSIZ];
+ char buffer[NMH_BUFSIZ], buffer2[NMH_BUFSIZ];
int i, c, rjust;
int value;
time_t t;
if (str) {
char *xp;
- strncpy(buffer, str, sizeof(buffer));
+ if (str != buffer)
+ strncpy(buffer, str, sizeof(buffer));
buffer[sizeof(buffer)-1] = '\0';
str = buffer;
while (isspace((unsigned char) *str))
case FT_LV_MINUS_L:
value = fmt->f_value - value;
break;
+ case FT_LV_MULTIPLY_L:
+ value *= fmt->f_value;
+ break;
case FT_LV_DIVIDE_L:
if (fmt->f_value)
value = value / fmt->f_value;
goto unfriendly;
if ((str = mn->m_pers) == NULL) {
if ((str = mn->m_note)) {
- strncpy (buffer, str, sizeof(buffer));
+ if (str != buffer)
+ strncpy (buffer, str, sizeof(buffer));
buffer[sizeof(buffer)-1] = '\0';
str = buffer;
if (*str == '(')
/* UNQUOTEs RFC-2822 quoted-string and quoted-pair */
case FT_LS_UNQUOTE:
if (str) {
- strncpy(buffer, str, sizeof(buffer));
+ if (str != buffer)
+ strncpy(buffer, str, sizeof(buffer));
/* strncpy doesn't NUL-terminate if it fills the buffer */
buffer[sizeof(buffer)-1] = '\0';
unquote_string(buffer, buffer2);
case FT_MYMBOX:
case FT_GETMYMBOX:
+ case FT_GETMYADDR:
/*
* if there's no component, we say true. Otherwise we
* say "true" only if we can parse the address and it
comp->c_mn = mn;
if (ismymbox(mn)) {
comp->c_flags |= CF_TRUE;
- /* Set str for use with FT_GETMYMBOX. It will be
- run through FT_LS_ADDR, which will strip off
- any pers name. */
- str = mn->m_text;
+ /* Set str for use with FT_GETMYMBOX. With
+ FT_GETMYADDR, comp->c_mn will be run through
+ FT_LS_ADDR, which will strip off any pers
+ name. */
+ str = mn->m_text;
} else {
comp->c_flags &= ~CF_TRUE;
- }
+ }
while ((sp = getname(sp)))
if ((comp->c_flags & CF_TRUE) == 0 &&
(mn = getm (sp, NULL, 0, NULL, 0)))
- if (ismymbox(mn))
+ if (ismymbox(mn)) {
comp->c_flags |= CF_TRUE;
+ /* Set str and comp->c_text for use with
+ FT_GETMYMBOX. With FT_GETMYADDR,
+ comp->c_mn will be run through
+ FT_LS_ADDR, which will strip off any
+ pers name. */
+ free (comp->c_text);
+ comp->c_text = str = strdup (mn->m_text);
+ comp->c_mn = mn;
+ }
comp->c_flags |= CF_PARSED;
} else {
while (getname("")) /* XXX */
comp->c_flags |= CF_TRUE;
else {
comp->c_flags &= ~CF_TRUE;
- }
+ }
comp->c_mn = &fmt_mnull;
}
if ((comp->c_flags & CF_TRUE) == 0 &&
- fmt->f_type == FT_GETMYMBOX) {
+ (fmt->f_type == FT_GETMYMBOX || fmt->f_type == FT_GETMYADDR)) {
/* Fool FT_LS_ADDR into not producing an address. */
comp->c_mn = &fmt_mnull; comp->c_text = NULL;
}
}
}
- return ((struct format *)0);
+ return (NULL);
}