/* eval4.c (comment9.c) - Don Yang (uguu.org) Preprocess step 4: replace names / safe characters evaluate -> q operand -> x expression -> e insertbop -> u operator -> y expindex -> h insertuop -> v left -> l lasttoken -> t argc -> c right -> r nestlevel -> s argv -> a parent -> p lit -> k node -> n newnode -> m errtext -> b op -> o cursor -> j i -> i tmp -> K 10/22/99 */ #include long x[1024], k; char e[1025], *b = "\nbaka."; int h, t, s, y[1024], l[1024], r[1024], p[1024], m, j, i; long q(int n) { long K; switch( y[n] ) { case 183: return q(r[n]); case 166: return -q(r[n]); case 150: return ~q(r[n]); case 133: return q(l[n]) * q(r[n]); case 117: if( (K = q(r[n])) == 0 ) return puts(b); return q(l[n]) / K; case 101: if( (K = q(r[n])) == 0 ) return puts(b); return q(l[n]) % K; case 84: return q(l[n]) + q(r[n]); case 68: return q(l[n]) - q(r[n]); case 51: return q(l[n]) & q(r[n]); case 34: return q(l[n]) ^ q(r[n]); case 17: return q(l[n]) | q(r[n]); default: return x[n]; } } void u(int o) { for(printf("%c ", i); y[p[j]] - 183 && (y[p[j]] & 7) >= (o & 7); j = p[j]); y[m] = o; p[m] = p[l[m] = j]; r[p[p[j] = m]] = m; j = m++; t = 0; } void v(int o) { if( o == 199 ) { printf("%ld ", k); t = 1; } else { putchar(i); t = 0; if( o == 183 ) s++; } y[m] = o; x[m] = k; r[p[m] = j] = m; j = m++; } int main(int c, char *a[]) { if( c == 1 ) return puts(b); h = 0; for(j = m = 1; j < c; j++) for(i = 0; a[j][i];) e[h++] = a[j][i++]; for(y[h = t = s = j = e[h] = 0] = 183; e[h];) if( e[h] >= 48 && e[h] <= 57 ) { if( e[h + 1] == 120 ) sscanf(e + (h += 2), "%lx", &k); else sscanf(e + h, "%ld", &k); if( t ) { i = 42; u(133); } for(v(199); (e[h] >= 48 && e[h] <= 57) || (e[h] >= 97 && e[h] <= 102); h++); } else { i = e[h++]; if( t ) { if( i == 40 ) { i = 42; u(133); i = 40; v(183); } else if( i == 41 && s ) { printf("\b) "); for(j = p[j]; y[j] - 183; j = p[j]); s--; } else { if( i == 42 ) u(133); else if( i == 47 ) u(117); else if( i == 37 ) u(101); else if( i == 43 ) u(84); else if( i == 45 ) u(68); else if( i == 38 ) u(51); else if( i == 94 ) u(34); else if( i == 124 ) u(17); } } else { if( i == 40 ) v(183); else if( i == 45 ) v(166); else if( i == 126 ) v(150); } } if( !t ) { k = 0; v(199); } for(i = !putchar(8); i++ < s; putchar(41)); k = q(0); return printf("\n= %ld (0x%lx)\n", k, k); }