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
This commit is contained in:
parent
470dc1d7e2
commit
6b38e18247
@ -98,19 +98,45 @@ static void not(void)
|
|||||||
|
|
||||||
static void set_output_base(void)
|
static void set_output_base(void)
|
||||||
{
|
{
|
||||||
base = (unsigned)pop();
|
static const char bases[] ALIGN1 = { 2, 8, 10, 16, 0 };
|
||||||
if ((base != 10) && (base != 16)) {
|
unsigned b = (unsigned)pop();
|
||||||
bb_error_msg("error, base %d is not supported", base);
|
|
||||||
|
base = *strchrnul(bases, b);
|
||||||
|
if (base == 0) {
|
||||||
|
bb_error_msg("error, base %u is not supported", b);
|
||||||
base = 10;
|
base = 10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_base(double print)
|
static void print_base(double print)
|
||||||
{
|
{
|
||||||
if (base == 16)
|
unsigned x, i;
|
||||||
printf("%x\n", (unsigned)print);
|
|
||||||
else
|
if (base == 10) {
|
||||||
printf("%g\n", print);
|
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)
|
static void print_stack_no_pop(void)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user