svn commit: trunk/busybox/miscutils
vda at busybox.net
vda at busybox.net
Thu Oct 30 23:25:50 UTC 2008
Author: vda
Date: 2008-10-30 16:25:50 -0700 (Thu, 30 Oct 2008)
New Revision: 23865
Log:
dc: support for bases 2 and 8, by Nate Case (ncase AT xes-inc.com)
function old new delta
print_base 87 176 +89
set_output_base 81 95 +14
static.bases - 5 +5
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/0 up/down: 108/0) Total: 108 bytes
Modified:
trunk/busybox/miscutils/dc.c
Changeset:
Modified: trunk/busybox/miscutils/dc.c
===================================================================
--- trunk/busybox/miscutils/dc.c 2008-10-30 17:42:49 UTC (rev 23864)
+++ trunk/busybox/miscutils/dc.c 2008-10-30 23:25:50 UTC (rev 23865)
@@ -98,19 +98,45 @@
static void set_output_base(void)
{
- base = (unsigned)pop();
- if ((base != 10) && (base != 16)) {
- bb_error_msg("error, base %d is not supported", base);
+ static const char bases[] ALIGN1 = { 2, 8, 10, 16, 0 };
+ unsigned b = (unsigned)pop();
+
+ base = *strchrnul(bases, b);
+ if (base == 0) {
+ bb_error_msg("error, base %u is not supported", b);
base = 10;
}
}
static void print_base(double print)
{
- if (base == 16)
- printf("%x\n", (unsigned)print);
- else
+ unsigned x, i;
+
+ if (base == 10) {
printf("%g\n", print);
+ return;
+ }
+
+ x = (unsigned)print;
+ switch (base) {
+ case 16:
+ printf("%x\n", x);
+ break;
+ case 8:
+ printf("%o\n", x);
+ break;
+ default: /* base 2 */
+ i = (unsigned)INT_MAX + 1;
+ do {
+ if (x & i) break;
+ i >>= 1;
+ } while (i > 1);
+ do {
+ bb_putchar('1' - !(x & i));
+ i >>= 1;
+ } while (i);
+ bb_putchar('\n');
+ }
}
static void print_stack_no_pop(void)
More information about the busybox-cvs
mailing list