diff options
-rw-r--r-- | miscutils/dc.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/miscutils/dc.c b/miscutils/dc.c index 7d5886eb2..6d4efa943 100644 --- a/miscutils/dc.c +++ b/miscutils/dc.c | |||
@@ -98,19 +98,45 @@ static void not(void) | |||
98 | 98 | ||
99 | static void set_output_base(void) | 99 | static void set_output_base(void) |
100 | { | 100 | { |
101 | base = (unsigned)pop(); | 101 | static const char bases[] ALIGN1 = { 2, 8, 10, 16, 0 }; |
102 | if ((base != 10) && (base != 16)) { | 102 | unsigned b = (unsigned)pop(); |
103 | bb_error_msg("error, base %d is not supported", base); | 103 | |
104 | base = *strchrnul(bases, b); | ||
105 | if (base == 0) { | ||
106 | bb_error_msg("error, base %u is not supported", b); | ||
104 | base = 10; | 107 | base = 10; |
105 | } | 108 | } |
106 | } | 109 | } |
107 | 110 | ||
108 | static void print_base(double print) | 111 | static void print_base(double print) |
109 | { | 112 | { |
110 | if (base == 16) | 113 | unsigned x, i; |
111 | printf("%x\n", (unsigned)print); | 114 | |
112 | else | 115 | if (base == 10) { |
113 | printf("%g\n", print); | 116 | printf("%g\n", print); |
117 | return; | ||
118 | } | ||
119 | |||
120 | x = (unsigned)print; | ||
121 | switch (base) { | ||
122 | case 16: | ||
123 | printf("%x\n", x); | ||
124 | break; | ||
125 | case 8: | ||
126 | printf("%o\n", x); | ||
127 | break; | ||
128 | default: /* base 2 */ | ||
129 | i = (unsigned)INT_MAX + 1; | ||
130 | do { | ||
131 | if (x & i) break; | ||
132 | i >>= 1; | ||
133 | } while (i > 1); | ||
134 | do { | ||
135 | bb_putchar('1' - !(x & i)); | ||
136 | i >>= 1; | ||
137 | } while (i); | ||
138 | bb_putchar('\n'); | ||
139 | } | ||
114 | } | 140 | } |
115 | 141 | ||
116 | static void print_stack_no_pop(void) | 142 | static void print_stack_no_pop(void) |