X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/e537b780f7aea8df01ddca1976f8c128d9c1fb55..86c5ebc87:/sbr/fmt_scan.c?ds=inline diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 47a5fe87..1ea5e623 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -49,24 +49,14 @@ match (char *str, char *sub) 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; @@ -93,13 +83,18 @@ cpnumber(charstring_t dest, int num, unsigned int wid, char fill, size_t max) { 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. */ @@ -144,7 +139,7 @@ cptrimmed(charstring_t dest, char *str, int wid, char fill, size_t max) { if ((sp = str)) { #ifdef MULTIBYTE_SUPPORT - mbtowc(NULL, NULL, 0); /* reset shift state */ + if (mbtowc(NULL, NULL, 0)) {} /* reset shift state */ #endif end = strlen(str); while (*sp && remaining > 0 && end > 0) { @@ -252,7 +247,7 @@ cpstripped (charstring_t dest, size_t max, char *str) len = strlen(str); #ifdef MULTIBYTE_SUPPORT - mbtowc(NULL, NULL, 0); /* Reset shift state */ + if (mbtowc(NULL, NULL, 0)) {} /* Reset shift state */ #endif /* MULTIBYTE_SUPPORT */ /* @@ -369,7 +364,7 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, { 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; @@ -499,6 +494,9 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, if (val < scale) { snprintf(buffer, sizeof(buffer), "%u", val); } else { + /* To prevent divide by 0, found by clang static + analyzer. */ + if (scale == 0) { scale = 1; } /* find correct scale for size (Kilo/Mega/Giga/Tera) */ for (unitcp = "KMGT"; val > (scale * scale); val /= scale) { @@ -688,7 +686,8 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, 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)) @@ -737,6 +736,9 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, 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; @@ -821,6 +823,7 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, default: value = -1; break; } + break; case FT_LV_ZONEF: if ((fmt->f_comp->c_tws->tw_flags & TW_SZONE) == TW_SZEXP) value = 1; @@ -828,7 +831,7 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, value = -1; break; case FT_LV_DST: - value = fmt->f_comp->c_tws->tw_flags & TW_DST; + value = fmt->f_comp->c_tws->tw_flags & TW_DST ? 1 : 0; break; case FT_LS_822DATE: str = dasctime (fmt->f_comp->c_tws , TW_ZONE); @@ -877,7 +880,8 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, 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 == '(') @@ -921,7 +925,8 @@ 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) { - 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); @@ -988,7 +993,7 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, lp = str; wid = value; - len = strlen (str); + len = str ? strlen (str) : 0; sp = fmt->f_text; indent = strlen (sp); wid -= indent; @@ -1058,6 +1063,8 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, break; 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 @@ -1069,24 +1076,46 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, if ((sp = comp->c_text) && (sp = getname(sp)) && (mn = getm (sp, NULL, 0, NULL, 0))) { comp->c_mn = mn; - if (ismymbox(mn)) + if (ismymbox(mn)) { comp->c_flags |= CF_TRUE; - else + /* 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 */ ; if (comp->c_text == 0) comp->c_flags |= CF_TRUE; - else + 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_GETMYADDR)) { + /* Fool FT_LS_ADDR into not producing an address. */ + comp->c_mn = &fmt_mnull; comp->c_text = NULL; + } break; } @@ -1146,5 +1175,5 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, } } - return ((struct format *)0); + return (NULL); }