+ n = snprintf(cp, ep - cp + 1, "%d", value);
+ if (n >= 0) {
+ if (n >= ep - cp) {
+ cp = ep;
+ } else
+ 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;
+ }