char * dup(ParmString str) {return dup_top(str);}
/* reverse Polish calculator */ int main() { int type; int print = 0; int swaps = 0; double op2; unsigned int mod; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '%': op2 = pop(); if (op2 != 0.0) push((unsigned int) pop() % (unsigned int) op2); else /* possibly clear the stack here, see 4-6 */ printf("error: no mod-zero\n"); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else /* possibly clear the stack here, see 4-6 */ printf("error: zero divisor\n"); break; case 'p': print = 1; print_top(); break; case 'd': dup_top(); break; case 'c': clear_stack(); break; case 's': swaps = 1; swap(); break; case '\n': if (print || swaps) swaps = print^=print; else printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; }