+ if (!c) {
+ printf("%" PRIu64 " Hz%s", freq, s);
+ return;
+ }
+
+ f = do_div(freq, d);
+
+ /* If there's a remainder, show the first few digits */
+ if (f) {
+ m = f;
+ while (m > 1000)
+ m /= 10;
+ while (m && !(m % 10))
+ m /= 10;
+ if (m >= 100)
+ m = (m / 10) + (m % 100 >= 50);
+ }
+
+ printf("%lu", (unsigned long) freq);
+ if (m)
+ printf(".%ld", m);
+ printf(" %cHz%s", c, s);
+}
+
+void print_size(uint64_t size, const char *s)
+{
+ unsigned long m = 0, n;
+ uint64_t f;
+ static const char names[] = {'E', 'P', 'T', 'G', 'M', 'K'};
+ unsigned long d = 10 * ARRAY_SIZE(names);
+ char c = 0;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(names); i++, d -= 10) {
+ if (size >> d) {
+ c = names[i];
+ break;
+ }
+ }
+
+ if (!c) {
+ printf("%" PRIu64 " Bytes%s", size, s);
+ return;
+ }
+
+ n = size >> d;
+ f = size & ((1ULL << d) - 1);