X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/7086ee95576e95aec1b54ad73c6fa6ead9186a3d..d4700e9d89995a338a134ed8fdb77ba26b6038d5:/sbr/fmt_scan.c diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index fe2a0044..ec94897e 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; } @@ -504,6 +490,55 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, 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;