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;
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;
}
* 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;
* 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;
}
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)");
cp += n;
}
break;
+ case FT_LS_KILO:
+ case FT_LS_KIBI:
+ {
+ char *unitcp;
+ unsigned int whole, tenths;
+ unsigned int scale;
+ unsigned int val = (unsigned int)value;
+ char *kibisuff;
+
+ switch (fmt->f_type) {
+ case FT_LS_KILO: scale = 1000; kibisuff = ""; break;
+ case FT_LS_KIBI: scale = 1024; kibisuff = "i"; break;
+ }
+
+ if (val < scale) {
+ snprintf(buffer, sizeof(buffer), "%u", val);
+ } else {
+
+ /* find correct scale for size (Kilo/Mega/Giga/Tera) */
+ for (unitcp = "KMGT"; val > (scale * scale); val /= scale) {
+ if (!*++unitcp)
+ break;
+ }
+
+ if (!*unitcp) {
+ strcpy(buffer, "huge");
+ } else {
+ /* val is scale times too big. we want tenths */
+ val *= 10;
+
+ /* round up */
+ val += (scale - 1);
+ val /= scale;
+
+ whole = val / 10;
+ tenths = val - (whole * 10);
+
+ if (tenths) {
+ snprintf(buffer, sizeof(buffer), "%u.%u%c%s",
+ whole, tenths, *unitcp, kibisuff);
+ } else {
+ snprintf(buffer, sizeof(buffer), "%u%c%s",
+ whole, *unitcp, kibisuff);
+ }
+ }
+ }
+ str = buffer;
+ }
+ break;
case FT_NUMF:
cpnumber (&cp, value, fmt->f_width, fmt->f_fill, ep - cp);
break;
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
break;
case FT_GOTO:
+ if (callbacks && callbacks->trace_func)
+ callbacks->trace_func(callbacks->trace_context, fmt, value,
+ str, scanl);
fmt += fmt->f_skip;
continue;
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)