Lines Matching refs:st
26 struct st {
38 static const char *evalexpr(struct st *st, const char *s, int d);
40 static const char *evalprim(struct st *st, const char *s, int d)
46 st->r = strtoul(s, &e, 10);
47 if (e == s || st->r == -1) return "";
51 st->r = st->n;
55 s = evalexpr(st, s+1, d);
60 s = evalprim(st, s+1, d);
61 st->r = !st->r;
67 static int binop(struct st *st, int op, unsigned long left)
69 unsigned long a = left, b = st->r;
71 case 0: st->r = a||b; return 0;
72 case 1: st->r = a&&b; return 0;
73 case 2: st->r = a==b; return 0;
74 case 3: st->r = a!=b; return 0;
75 case 4: st->r = a>=b; return 0;
76 case 5: st->r = a<=b; return 0;
77 case 6: st->r = a>b; return 0;
78 case 7: st->r = a<b; return 0;
79 case 8: st->r = a+b; return 0;
80 case 9: st->r = a-b; return 0;
81 case 10: st->r = a*b; return 0;
82 case 11: if (b) {st->r = a%b; return 0;} return 1;
83 case 12: if (b) {st->r = a/b; return 0;} return 1;
88 static const char *parseop(struct st *st, const char *s)
97 st->op = i;
101 st->op = i+2;
106 st->op = 13;
110 static const char *evalbinop(struct st *st, const char *s, int minprec, int d)
116 s = evalprim(st, s, d);
117 s = parseop(st, s);
120 st->r (left hand side value) and st->op are now set,
124 op = st->op;
127 left = st->r;
128 s = evalbinop(st, s, prec[op], d);
129 if (binop(st, op, left))
134 static const char *evalexpr(struct st *st, const char *s, int d)
139 s = evalbinop(st, s, 0, d);
142 a = st->r;
143 s = evalexpr(st, s+1, d);
146 b = st->r;
147 s = evalexpr(st, s+1, d);
148 st->r = a ? b : st->r;
154 struct st st;
155 st.n = n;
156 s = evalexpr(&st, s, 100);
157 return *s == ';' ? st.r : -1;