X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/b24a1b1ac51ca3bbacc82700dd1388b7dae2633d..079b426e4e813191dedbf8ba4aa454adf2f0a46d:/sbr/fmt_scan.c diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index a7ad1249..e4d79d57 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -47,7 +47,6 @@ match (char *str, char *sub) int c1, c2; char *s1, *s2; -#ifdef LOCALE while ((c1 = *sub)) { c1 = (isascii((unsigned char) c1) && isalpha((unsigned char) c1) && isupper((unsigned char) c1)) ? tolower((unsigned char) c1) : c1; @@ -71,19 +70,6 @@ match (char *str, char *sub) if (! c1) return 1; } -#else - while ((c1 = *sub)) { - while ((c2 = *str++) && (c1 | 040) != (c2 | 040)) - ; - if (! c2) - return 0; - s1 = sub + 1; s2 = str; - while ((c1 = *s1++) && (c1 | 040) == (*s2++ | 040)) - ; - if (! c1) - return 1; - } -#endif return 1; } @@ -175,11 +161,11 @@ cptrimmed(char **dest, char **ep, char *str, unsigned int wid, char fill, * widths, so use the column width to bump the end pointer when * appropriate. */ - if (char_len > 1 && epmax - *ep >= char_len - w) { + if (w >= 0 && char_len > 1 && epmax - *ep >= char_len - w) { *ep += char_len - w; } - if (cp + w > *ep) + if (w >= 0 && cp + w > *ep) break; end -= char_len; @@ -278,7 +264,7 @@ cpstripped (char **dest, char **end, char *max, char *str) * by the number of "extra" bytes in this character. That's the * character length (char_len) minus the column width (w). */ - if (char_len > 1 && max - *end >= char_len - w) { + if (w >= 0 && char_len > 1 && max - *end >= char_len - w) { *end += char_len - w; } @@ -467,29 +453,31 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, scanl + max - 1); break; case FT_STRLIT: - sp = str; - while ((c = *sp++) && cp < ep) - *cp++ = c; + if (str) { + sp = str; + while ((c = *sp++) && cp < ep) + *cp++ = c; + } break; - case FT_STRLITZ: { - size_t len = strlen (str); - - /* Don't want to emit part of an escape sequence. So if - there isn't enough room in the buffer for the entire - string, skip it completely. */ - if (cp - scanl + len + 1 < max) { - for (sp = str; *sp; *cp++ = *sp++) continue; - - /* This string doesn't count against the width. So - increase ep the same amount as cp, only if the - scan buffer will always be large enough. */ - if (ep - scanl + len + 1 < max) { - ep += len; + case FT_STRLITZ: + if (str) { + size_t len = strlen (str); + + /* Don't want to emit part of an escape sequence. So if + there isn't enough room in the buffer for the entire + string, skip it completely. */ + if (cp - scanl + len + 1 < max) { + for (sp = str; *sp; *cp++ = *sp++) continue; + + /* This string doesn't count against the width. + So increase ep the same amount as cp, only if the + scan buffer will always be large enough. */ + if (ep - scanl + len + 1 < max) { + ep += len; + } } } - break; - } case FT_STRFW: adios (NULL, "internal error (FT_STRFW)"); @@ -518,6 +506,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, case FT_IF_S: if (!(value = (str && *str))) { + if (callbacks && callbacks->trace_func) + callbacks->trace_func(callbacks->trace_context, fmt, value, + str, scanl); fmt += fmt->f_skip; continue; } @@ -525,6 +516,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, case FT_IF_S_NULL: if (!(value = (str == NULL || *str == 0))) { + if (callbacks && callbacks->trace_func) + callbacks->trace_func(callbacks->trace_context, fmt, value, + str, scanl); fmt += fmt->f_skip; continue; } @@ -532,6 +526,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, case FT_IF_V_EQ: if (value != fmt->f_value) { + if (callbacks && callbacks->trace_func) + callbacks->trace_func(callbacks->trace_context, fmt, value, + str, scanl); fmt += fmt->f_skip; continue; } @@ -539,6 +536,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, case FT_IF_V_NE: if (value == fmt->f_value) { + if (callbacks && callbacks->trace_func) + callbacks->trace_func(callbacks->trace_context, fmt, value, + str, scanl); fmt += fmt->f_skip; continue; } @@ -546,6 +546,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, case FT_IF_V_GT: if (value <= fmt->f_value) { + if (callbacks && callbacks->trace_func) + callbacks->trace_func(callbacks->trace_context, fmt, value, + str, scanl); fmt += fmt->f_skip; continue; } @@ -553,6 +556,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, case FT_IF_MATCH: if (!(value = (str && match (str, fmt->f_text)))) { + if (callbacks && callbacks->trace_func) + callbacks->trace_func(callbacks->trace_context, fmt, value, + str, scanl); fmt += fmt->f_skip; continue; } @@ -567,6 +573,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, case FT_IF_AMATCH: if (!(value = (str && uprf (str, fmt->f_text)))) { + if (callbacks && callbacks->trace_func) + callbacks->trace_func(callbacks->trace_context, fmt, value, + str, scanl); fmt += fmt->f_skip; continue; } @@ -597,6 +606,9 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, break; case FT_GOTO: + if (callbacks && callbacks->trace_func) + callbacks->trace_func(callbacks->trace_context, fmt, value, + str, scanl); fmt += fmt->f_skip; continue; @@ -1053,7 +1065,7 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, there isn't enough room in the buffer for the entire string, skip it completely. Need room for null terminator, and maybe trailing newline (added below). */ - if (cp - scanl + strlen (str) + 1 < max) { + if (str && (cp - scanl + strlen (str) + 1 < max)) { for (sp = str; *sp; *cp++ = *sp++) continue; } if (callbacks && callbacks->trace_func)