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