diff options
| author | vda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2006-11-05 00:44:39 +0000 |
|---|---|---|
| committer | vda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2006-11-05 00:44:39 +0000 |
| commit | 04353387ec2a1ee4a28e44be9062c2a6967f397d (patch) | |
| tree | 95ef467494c3178ffb308b95f8743886d9c9a5ae | |
| parent | 48b1ebd12ec4ef182b4ea423f2309705ae141e8e (diff) | |
| download | busybox-w32-04353387ec2a1ee4a28e44be9062c2a6967f397d.tar.gz busybox-w32-04353387ec2a1ee4a28e44be9062c2a6967f397d.tar.bz2 busybox-w32-04353387ec2a1ee4a28e44be9062c2a6967f397d.zip | |
smart_ulltoa5: make available in libbb
git-svn-id: svn://busybox.net/trunk/busybox@16510 69ca8d6d-28ef-0310-b511-8ec308f3f277
| -rw-r--r-- | include/libbb.h | 1 | ||||
| -rw-r--r-- | libbb/xfuncs.c | 60 | ||||
| -rw-r--r-- | miscutils/nmeter.c | 36 |
3 files changed, 56 insertions, 41 deletions
diff --git a/include/libbb.h b/include/libbb.h index 607433118..8c1d78434 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -278,6 +278,7 @@ extern FILE *fopen_or_warn(const char *filename, const char *mode); | |||
| 278 | extern FILE *fopen_or_warn_stdin(const char *filename); | 278 | extern FILE *fopen_or_warn_stdin(const char *filename); |
| 279 | 279 | ||
| 280 | 280 | ||
| 281 | extern void smart_ulltoa5(unsigned long long ul, char buf[5]); | ||
| 281 | extern void utoa_to_buf(unsigned n, char *buf, unsigned buflen); | 282 | extern void utoa_to_buf(unsigned n, char *buf, unsigned buflen); |
| 282 | extern char *utoa(unsigned n); | 283 | extern char *utoa(unsigned n); |
| 283 | extern void itoa_to_buf(int n, char *buf, unsigned buflen); | 284 | extern void itoa_to_buf(int n, char *buf, unsigned buflen); |
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index c72265003..352515af4 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c | |||
| @@ -201,23 +201,71 @@ void xsetenv(const char *key, const char *value) | |||
| 201 | bb_error_msg_and_die(bb_msg_memory_exhausted); | 201 | bb_error_msg_and_die(bb_msg_memory_exhausted); |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | |||
| 205 | // Converts unsigned long long value into compact 4-char | ||
| 206 | // representation. Examples: "1234", "1.2k", " 27M", "123T" | ||
| 207 | // Fifth char is always '\0' | ||
| 208 | void smart_ulltoa5(unsigned long long ul, char buf[5]) | ||
| 209 | { | ||
| 210 | char *fmt; | ||
| 211 | char c; | ||
| 212 | unsigned v,idx = 0; | ||
| 213 | ul *= 10; | ||
| 214 | if (ul > 9999*10) { // do not scale if 9999 or less | ||
| 215 | while (ul >= 10000) { | ||
| 216 | ul /= 1024; | ||
| 217 | idx++; | ||
| 218 | } | ||
| 219 | } | ||
| 220 | v = ul; // ullong divisions are expensive, avoid them | ||
| 221 | |||
| 222 | fmt = " 123456789"; | ||
| 223 | if (!idx) { // 9999 or less: use 1234 format | ||
| 224 | c = buf[0] = " 123456789"[v/10000]; | ||
| 225 | if (c!=' ') fmt = "0123456789"; | ||
| 226 | c = buf[1] = fmt[v/1000%10]; | ||
| 227 | if (c!=' ') fmt = "0123456789"; | ||
| 228 | buf[2] = fmt[v/100%10]; | ||
| 229 | buf[3] = "0123456789"[v/10%10]; | ||
| 230 | } else { | ||
| 231 | if (v>=10*10) { // scaled value is >=10: use 123M format | ||
| 232 | c = buf[0] = " 123456789"[v/1000]; | ||
| 233 | if (c!=' ') fmt = "0123456789"; | ||
| 234 | buf[1] = fmt[v/100%10]; | ||
| 235 | buf[2] = "0123456789"[v/10%10]; | ||
| 236 | } else { // scaled value is <10: use 1.2M format | ||
| 237 | buf[0] = "0123456789"[v/10]; | ||
| 238 | buf[1] = '.'; | ||
| 239 | buf[2] = "0123456789"[v%10]; | ||
| 240 | } | ||
| 241 | // see http://en.wikipedia.org/wiki/Tera | ||
| 242 | buf[3] = " kMGTPEZY"[idx]; | ||
| 243 | } | ||
| 244 | buf[4] = '\0'; | ||
| 245 | } | ||
| 246 | |||
| 247 | |||
| 204 | // Convert unsigned integer to ascii, writing into supplied buffer. A | 248 | // Convert unsigned integer to ascii, writing into supplied buffer. A |
| 205 | // truncated result is always null terminated (unless buflen is 0), and | 249 | // truncated result is always null terminated (unless buflen is 0), and |
| 206 | // contains the first few digits of the result ala strncpy. | 250 | // contains the first few digits of the result ala strncpy. |
| 251 | void BUG_sizeof_unsigned_not_4(void); | ||
| 207 | void utoa_to_buf(unsigned n, char *buf, unsigned buflen) | 252 | void utoa_to_buf(unsigned n, char *buf, unsigned buflen) |
| 208 | { | 253 | { |
| 209 | int i, out = 0; | 254 | unsigned i, out, res; |
| 255 | if (sizeof(unsigned) != 4) | ||
| 256 | BUG_sizeof_unsigned_not_4(); | ||
| 210 | if (buflen) { | 257 | if (buflen) { |
| 211 | for (i=1000000000; i; i/=10) { | 258 | out = 0; |
| 212 | int res = n/i; | 259 | for (i = 1000000000; i; i /= 10) { |
| 213 | 260 | res = n / i; | |
| 214 | if ((res || out || i == 1) && --buflen>0) { | 261 | if (res || out || i == 1) { |
| 262 | if (!--buflen) break; | ||
| 215 | out++; | 263 | out++; |
| 216 | n -= res*i; | 264 | n -= res*i; |
| 217 | *buf++ = '0' + res; | 265 | *buf++ = '0' + res; |
| 218 | } | 266 | } |
| 219 | } | 267 | } |
| 220 | *buf = 0; | 268 | *buf = '\0'; |
| 221 | } | 269 | } |
| 222 | } | 270 | } |
| 223 | 271 | ||
diff --git a/miscutils/nmeter.c b/miscutils/nmeter.c index d71bd6add..326d7b85f 100644 --- a/miscutils/nmeter.c +++ b/miscutils/nmeter.c | |||
| @@ -214,42 +214,8 @@ static int rdval_diskstats(const char* p, ullong *vec) | |||
| 214 | 214 | ||
| 215 | static void scale(ullong ul) | 215 | static void scale(ullong ul) |
| 216 | { | 216 | { |
| 217 | char *fmt; | ||
| 218 | char buf[5]; | 217 | char buf[5]; |
| 219 | char c; | 218 | smart_ulltoa5(ul, buf); |
| 220 | unsigned v,idx = 0; | ||
| 221 | ul *= 10; | ||
| 222 | if (ul > 9999*10) { // do not scale if 9999 or less | ||
| 223 | while (ul >= 10000) { | ||
| 224 | ul /= 1024; | ||
| 225 | idx++; | ||
| 226 | } | ||
| 227 | } | ||
| 228 | v = ul; // ullong divisions are expensive, avoid them | ||
| 229 | |||
| 230 | fmt = " 123456789"; | ||
| 231 | if (!idx) { // 9999 or less: use 1234 format | ||
| 232 | c = buf[0] = " 123456789"[v/10000]; | ||
| 233 | if (c!=' ') fmt = "0123456789"; | ||
| 234 | c = buf[1] = fmt[v/1000%10]; | ||
| 235 | if (c!=' ') fmt = "0123456789"; | ||
| 236 | buf[2] = fmt[v/100%10]; | ||
| 237 | buf[3] = "0123456789"[v/10%10]; | ||
| 238 | } else { | ||
| 239 | if (v>=10*10) { // scaled value is >=10: use 123M format | ||
| 240 | c = buf[0] = " 123456789"[v/1000]; | ||
| 241 | if (c!=' ') fmt = "0123456789"; | ||
| 242 | buf[1] = fmt[v/100%10]; | ||
| 243 | buf[2] = "0123456789"[v/10%10]; | ||
| 244 | } else { // scaled value is <10: use 1.2M format | ||
| 245 | buf[0] = "0123456789"[v/10]; | ||
| 246 | buf[1] = '.'; | ||
| 247 | buf[2] = "0123456789"[v%10]; | ||
| 248 | } | ||
| 249 | // see http://en.wikipedia.org/wiki/Tera | ||
| 250 | buf[3] = " kMGTPEZY"[idx]; | ||
| 251 | } | ||
| 252 | buf[4] = '\0'; | ||
| 253 | put(buf); | 219 | put(buf); |
| 254 | } | 220 | } |
| 255 | 221 | ||
