Exemple #1
0
 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;
}