exit(1);
}
}
+
+static char *num_with_unit(char *buf, unsigned num, const char *units[])
+{
+ const int div[] = {100,10,1};
+ unsigned order = 0;
+ int d;
+
+ while (num > 999 && units[(order+3)/3] != NULL) {
+ num /= 10;
+ order++;
+ }
+
+ d = div[(order+2)%3];
+ if (d == 1)
+ sprintf(buf, "%4d %s", num, units[(order+2)/3]);
+ else
+ sprintf(buf, "%d.%.*d %s", num/d, (d==10) ? 1 : 2, num%d, units[(order+2)/3]);
+ return buf;
+}
+
+char *bandwidth_to_text(char *buf, unsigned bandwidth_bps)
+{
+ const char *unit[] = {"bps", "kbps", "Mbps", NULL};
+ return num_with_unit(buf, bandwidth_bps, unit);
+}
+
+char *usec_to_text(char *buf, unsigned usec)
+{
+ const char *unit[] = {"us", "ms", "s", NULL};
+ return num_with_unit(buf, usec, unit);
+}
+
+
+static void test_usec_to_text() __attribute__((unused));
+static void test_usec_to_text()
+{
+ int num=0;
+ char buf[1000];
+ int i;
+ for (i=1; i<11; i++) {
+ num = num*10 + i;
+ printf("%s = %d\n", usec_to_text(buf, num), num);
+ }
+}
+