10 #define bail(arg...) do { fprintf(stderr, ##arg); exit(EXIT_FAILURE); } while (0)
15 char opstack[BUFSIZE];
21 static void dump(char *pref)
24 fprintf(stderr,"%s: i[",pref);
25 for (i=0;i<istackp;i++) {
26 if (i) fputc(',',stderr);
27 fprintf(stderr,"%d",istack[i]);
29 fprintf(stderr,"],op=[");
30 for (i=0;i<opstackp;i++) fputc(opstack[i],stderr);
31 fprintf(stderr,"]\n");
35 static char lex(int *ip)
40 while (isspace(*arg)) arg++;
42 case 0: case '+': case '-': case '*': case '/': case '(': case ')':
47 l=strtol(arg,&arg,10);
51 bail("Invalid characted in string: %s\n",arg);
55 static int oppri(char op)
59 case '+': case '-': return (10);
60 case '*': case '/': return (20);
67 static void evalit(void)
70 assert(opstackp); opstackp--;
72 if (opstack[opstackp]!='(') bail("2 arguments for operator '%c' required!\n",opstack[opstackp]);
73 else bail("Stray '('!\n");
75 switch (opstack[opstackp]) {
76 case '+': istack[istackp-1]+=istack[istackp]; break;
77 case '-': istack[istackp-1]-=istack[istackp]; break;
78 case '*': istack[istackp-1]*=istack[istackp]; break;
80 if (!istack[istackp]) bail("Division of %d by zero not supported!\n",istack[istackp-1]);
81 istack[istackp-1]/=istack[istackp];
86 static void pushop(char op)
89 while (opstackp && op!='(' && oppri(opstack[opstackp-1])>=mypri)
93 if (!opstackp || opstack[opstackp-1]!='(')
94 bail("Not enough content for brackets-inside space!\n");
98 if (opstackp>=BUFSIZE) bail("Too many operators (%d is max)!\n",BUFSIZE);
99 opstack[opstackp++]=op;
102 static void process(void)
108 for (lastop=0;;lastop=op) switch (op=lex(&curi)) {
110 if (lastop=='n') bail("Two successive numbers not permitted!\n");
111 if (istackp>=BUFSIZE) bail("Too many operators (%d is max)!\n",BUFSIZE);
112 istack[istackp++]=curi;
115 if (lastop=='n') bail("Open-bracket not permitted after number!\n");
118 case '+': case '-': case '*': case '/': case ')': pushop(op); break;
121 if (istackp!=1||opstackp)
122 bail("Machine not in sane state on the end of expression, ints=%d,ops=%d!\n",istackp,opstackp);
123 printf("%d\n",istack[0]);
129 int main(int argc,char **argv)
132 for (argn=1;argn<argc;argn++) {
136 return(EXIT_SUCCESS);