summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--miscutils/dc.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/miscutils/dc.c b/miscutils/dc.c
index 7d5886e..6d4efa9 100644
--- a/miscutils/dc.c
+++ b/miscutils/dc.c
@@ -98,19 +98,45 @@ static void not(void)
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)