Support the o, f and p options, patch by Magnus M�rtensson

This commit is contained in:
Glenn L McGrath 2002-12-12 10:31:53 +00:00
parent b8dff0c2a2
commit 6d07432b2f
2 changed files with 40 additions and 2 deletions

View File

@ -245,7 +245,12 @@
#define dc_full_usage \ #define dc_full_usage \
"This is a Tiny RPN calculator that understands the\n" \ "This is a Tiny RPN calculator that understands the\n" \
"following operations: +, -, /, *, and, or, not, eor.\n" \ "following operations: +, -, /, *, and, or, not, eor.\n" \
"i.e., 'dc 2 2 add' -> 4, and 'dc 8 8 \\* 2 2 + /' -> 16" "i.e., 'dc 2 2 add' -> 4, and 'dc 8 8 \\* 2 2 + /' -> 16" \
"p - Prints the value on the top of the stack, without altering the stack.\n" \
"f - Prints the entire contents of the stack without altering anything.\n" \
"o - Pops the value off the top of the stack and uses it to set the output radix.\n" \
" Only 10 and 16 are supported.\n"
#define dc_example_usage \ #define dc_example_usage \
"$ dc 2 2 +\n" \ "$ dc 2 2 +\n" \
"4\n" \ "4\n" \

View File

@ -11,6 +11,7 @@
static double stack[100]; static double stack[100];
static unsigned int pointer; static unsigned int pointer;
static unsigned char base;
static void push(double a) static void push(double a)
{ {
@ -70,9 +71,38 @@ static void not(void)
push(~(unsigned int) pop()); push(~(unsigned int) pop());
} }
static void set_output_base(void)
{
base=(unsigned char)pop();
if ((base != 10) && (base != 16)) {
fprintf(stderr, "Error: base = %d is not supported.\n", base);
base=10;
}
}
static void print_base(double print)
{
if (base == 16)
printf("%x\n", (unsigned int)print);
else
printf("%g\n", print);
}
static void print_stack_no_pop(void)
{
unsigned int i=pointer;
while (i)
print_base(stack[--i]);
}
static void print_no_pop(void)
{
print_base(stack[pointer-1]);
}
static void print(void) static void print(void)
{ {
printf("%g\n", pop()); print_base(pop());
} }
struct op { struct op {
@ -93,6 +123,9 @@ static const struct op operators[] = {
{"or", or}, {"or", or},
{"not", not}, {"not", not},
{"eor", eor}, {"eor", eor},
{"p", print_no_pop},
{"f", print_stack_no_pop},
{"o", set_output_base},
{0, 0} {0, 0}
}; };