xref: /inferno-os/utils/acid/expr.c (revision 1272589e9dbbf247bc21e6970137eba8dcc947f3)
174a4d8c2SCharles.Forsyth #include <lib9.h>
274a4d8c2SCharles.Forsyth #include <bio.h>
374a4d8c2SCharles.Forsyth #include <ctype.h>
474a4d8c2SCharles.Forsyth #include "mach.h"
574a4d8c2SCharles.Forsyth #define Extern extern
674a4d8c2SCharles.Forsyth #include "acid.h"
774a4d8c2SCharles.Forsyth 
874a4d8c2SCharles.Forsyth static int fsize[] =
974a4d8c2SCharles.Forsyth {
1074a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,0,	/* 0-7 */
1174a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,0,	/* 8-15 */
1274a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,0,	/* 16-23 */
1374a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,0,	/* 24-31 */
1474a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,0,	/* 32-39 */
1574a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,0,	/* 40-47 */
1674a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,0,	/* 48-55 */
1774a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,0,	/* 56-63 */
1874a4d8c2SCharles.Forsyth 	0,			/* 64 */
1974a4d8c2SCharles.Forsyth 	4,			/* 65	['A'] 4, */
2074a4d8c2SCharles.Forsyth 	4,			/* 66	['B'] 4, */
2174a4d8c2SCharles.Forsyth 	1,			/* 67	['C'] 1, */
2274a4d8c2SCharles.Forsyth 	4,			/* 68	['D'] 4, */
2374a4d8c2SCharles.Forsyth 	0,			/* 69 */
2474a4d8c2SCharles.Forsyth 	8,			/* 70	['F'] 8, */
2574a4d8c2SCharles.Forsyth 	8,			/* 71	['G'] 8, */
2674a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,		/* 72-78 */
2774a4d8c2SCharles.Forsyth 	4,			/* 79	['O'] 4, */
2874a4d8c2SCharles.Forsyth 	0,			/* 80 */
2974a4d8c2SCharles.Forsyth 	4,			/* 81	['Q'] 4, */
3074a4d8c2SCharles.Forsyth 	4,			/* 82	['R'] 4, */
3174a4d8c2SCharles.Forsyth 	4,			/* 83	['S'] 4, */
3274a4d8c2SCharles.Forsyth 	0,			/* 84 */
3374a4d8c2SCharles.Forsyth 	4,			/* 85	['U'] 4, */
3474a4d8c2SCharles.Forsyth 	8,			/* 86	['V'] 8, */
3574a4d8c2SCharles.Forsyth 	0,			/* 87 */
3674a4d8c2SCharles.Forsyth 	4,			/* 88	['X'] 4, */
3774a4d8c2SCharles.Forsyth 	8,			/* 89	['Y'] 8, */
3874a4d8c2SCharles.Forsyth 	8,			/* 90	['Z'] 8, */
3974a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,		/* 91-96 */
4074a4d8c2SCharles.Forsyth 	4,			/* 97	['a'] 4, */
4174a4d8c2SCharles.Forsyth 	1,			/* 98	['b'] 1, */
4274a4d8c2SCharles.Forsyth 	1,			/* 99	['c'] 1, */
4374a4d8c2SCharles.Forsyth 	2,			/* 100	['d'] 2, */
4474a4d8c2SCharles.Forsyth 	0,			/* 101 */
4574a4d8c2SCharles.Forsyth 	4,			/* 102	['f'] 4, */
4674a4d8c2SCharles.Forsyth 	4,			/* 103	['g'] 4, */
4774a4d8c2SCharles.Forsyth 	0,0,0,0,0,0,0,		/* 104-110 */
4874a4d8c2SCharles.Forsyth 	2,			/* 111	['o'] 2, */
4974a4d8c2SCharles.Forsyth 	0,			/* 112 */
5074a4d8c2SCharles.Forsyth 	2,			/* 113	['q'] 2, */
5174a4d8c2SCharles.Forsyth 	2,			/* 114	['r'] 2, */
5274a4d8c2SCharles.Forsyth 	4,			/* 115	['s'] 4, */
5374a4d8c2SCharles.Forsyth 	0,			/* 116 */
5474a4d8c2SCharles.Forsyth 	2,			/* 117	['u'] 2, */
5574a4d8c2SCharles.Forsyth 	0,0,			/* 118-119 */
5674a4d8c2SCharles.Forsyth 	2,			/* 120	['x'] 2, */
5774a4d8c2SCharles.Forsyth };
5874a4d8c2SCharles.Forsyth 
5974a4d8c2SCharles.Forsyth int
fmtsize(Value * v)6074a4d8c2SCharles.Forsyth fmtsize(Value *v)
6174a4d8c2SCharles.Forsyth {
6274a4d8c2SCharles.Forsyth 	int ret;
6374a4d8c2SCharles.Forsyth 
6474a4d8c2SCharles.Forsyth 	switch(v->vstore.fmt) {
6574a4d8c2SCharles.Forsyth 	default:
6674a4d8c2SCharles.Forsyth 		return  fsize[v->vstore.fmt];
6774a4d8c2SCharles.Forsyth 	case 'i':
6874a4d8c2SCharles.Forsyth 	case 'I':
6974a4d8c2SCharles.Forsyth 		if(v->type != TINT || machdata == 0)
7074a4d8c2SCharles.Forsyth 			error("no size for i fmt pointer ++/--");
7174a4d8c2SCharles.Forsyth 		ret = (*machdata->instsize)(cormap, v->vstore.u0.sival);
7274a4d8c2SCharles.Forsyth 		if(ret < 0) {
7374a4d8c2SCharles.Forsyth 			ret = (*machdata->instsize)(symmap, v->vstore.u0.sival);
7474a4d8c2SCharles.Forsyth 			if(ret < 0)
7574a4d8c2SCharles.Forsyth 				error("%r");
7674a4d8c2SCharles.Forsyth 		}
7774a4d8c2SCharles.Forsyth 		return ret;
7874a4d8c2SCharles.Forsyth 	}
7974a4d8c2SCharles.Forsyth }
8074a4d8c2SCharles.Forsyth 
8174a4d8c2SCharles.Forsyth void
chklval(Node * lp)8274a4d8c2SCharles.Forsyth chklval(Node *lp)
8374a4d8c2SCharles.Forsyth {
8474a4d8c2SCharles.Forsyth 	if(lp->op != ONAME)
8574a4d8c2SCharles.Forsyth 		error("need l-value");
8674a4d8c2SCharles.Forsyth }
8774a4d8c2SCharles.Forsyth 
8874a4d8c2SCharles.Forsyth void
olist(Node * n,Node * res)8974a4d8c2SCharles.Forsyth olist(Node *n, Node *res)
9074a4d8c2SCharles.Forsyth {
9174a4d8c2SCharles.Forsyth 	expr(n->left, res);
9274a4d8c2SCharles.Forsyth 	expr(n->right, res);
9374a4d8c2SCharles.Forsyth }
9474a4d8c2SCharles.Forsyth 
9574a4d8c2SCharles.Forsyth void
oeval(Node * n,Node * res)9674a4d8c2SCharles.Forsyth oeval(Node *n, Node *res)
9774a4d8c2SCharles.Forsyth {
9874a4d8c2SCharles.Forsyth 	expr(n->left, res);
9974a4d8c2SCharles.Forsyth 	if(res->type != TCODE)
10074a4d8c2SCharles.Forsyth 		error("bad type for eval");
10174a4d8c2SCharles.Forsyth 	expr(res->nstore.u0.scc, res);
10274a4d8c2SCharles.Forsyth }
10374a4d8c2SCharles.Forsyth 
10474a4d8c2SCharles.Forsyth void
ocast(Node * n,Node * res)10574a4d8c2SCharles.Forsyth ocast(Node *n, Node *res)
10674a4d8c2SCharles.Forsyth {
10774a4d8c2SCharles.Forsyth 	if(n->sym->lt == 0)
10874a4d8c2SCharles.Forsyth 		error("%s is not a complex type", n->sym->name);
10974a4d8c2SCharles.Forsyth 
11074a4d8c2SCharles.Forsyth 	expr(n->left, res);
11174a4d8c2SCharles.Forsyth 	res->nstore.comt = n->sym->lt;
11274a4d8c2SCharles.Forsyth 	res->nstore.fmt = 'a';
11374a4d8c2SCharles.Forsyth }
11474a4d8c2SCharles.Forsyth 
11574a4d8c2SCharles.Forsyth void
oindm(Node * n,Node * res)11674a4d8c2SCharles.Forsyth oindm(Node *n, Node *res)
11774a4d8c2SCharles.Forsyth {
11874a4d8c2SCharles.Forsyth 	Map *m;
11974a4d8c2SCharles.Forsyth 	Node l;
12074a4d8c2SCharles.Forsyth 
12174a4d8c2SCharles.Forsyth 	m = cormap;
12274a4d8c2SCharles.Forsyth 	if(m == 0)
12374a4d8c2SCharles.Forsyth 		m = symmap;
12474a4d8c2SCharles.Forsyth 	expr(n->left, &l);
12574a4d8c2SCharles.Forsyth 	if(l.type != TINT)
12674a4d8c2SCharles.Forsyth 		error("bad type for *");
12774a4d8c2SCharles.Forsyth 	if(m == 0)
12874a4d8c2SCharles.Forsyth 		error("no map for *");
12974a4d8c2SCharles.Forsyth 	indir(m, l.nstore.u0.sival, l.nstore.fmt, res);
13074a4d8c2SCharles.Forsyth 	res->nstore.comt = l.nstore.comt;
13174a4d8c2SCharles.Forsyth }
13274a4d8c2SCharles.Forsyth 
13374a4d8c2SCharles.Forsyth void
oindc(Node * n,Node * res)13474a4d8c2SCharles.Forsyth oindc(Node *n, Node *res)
13574a4d8c2SCharles.Forsyth {
13674a4d8c2SCharles.Forsyth 	Map *m;
13774a4d8c2SCharles.Forsyth 	Node l;
13874a4d8c2SCharles.Forsyth 
13974a4d8c2SCharles.Forsyth 	m = symmap;
14074a4d8c2SCharles.Forsyth 	if(m == 0)
14174a4d8c2SCharles.Forsyth 		m = cormap;
14274a4d8c2SCharles.Forsyth 	expr(n->left, &l);
14374a4d8c2SCharles.Forsyth 	if(l.type != TINT)
14474a4d8c2SCharles.Forsyth 		error("bad type for @");
14574a4d8c2SCharles.Forsyth 	if(m == 0)
14674a4d8c2SCharles.Forsyth 		error("no map for @");
14774a4d8c2SCharles.Forsyth 	indir(m, l.nstore.u0.sival, l.nstore.fmt, res);
14874a4d8c2SCharles.Forsyth 	res->nstore.comt = l.nstore.comt;
14974a4d8c2SCharles.Forsyth }
15074a4d8c2SCharles.Forsyth 
15174a4d8c2SCharles.Forsyth void
oframe(Node * n,Node * res)15274a4d8c2SCharles.Forsyth oframe(Node *n, Node *res)
15374a4d8c2SCharles.Forsyth {
15474a4d8c2SCharles.Forsyth 	char *p;
15574a4d8c2SCharles.Forsyth 	Node *lp;
156d67b7dadSforsyth 	uvlong ival;
15774a4d8c2SCharles.Forsyth 	Frtype *f;
15874a4d8c2SCharles.Forsyth 
15974a4d8c2SCharles.Forsyth 	p = n->sym->name;
16074a4d8c2SCharles.Forsyth 	while(*p && *p == '$')
16174a4d8c2SCharles.Forsyth 		p++;
16274a4d8c2SCharles.Forsyth 	lp = n->left;
16374a4d8c2SCharles.Forsyth 	if(localaddr(cormap, p, lp->sym->name, &ival, rget) < 0)
16474a4d8c2SCharles.Forsyth 		error("colon: %r");
16574a4d8c2SCharles.Forsyth 
16674a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = ival;
16774a4d8c2SCharles.Forsyth 	res->op = OCONST;
16874a4d8c2SCharles.Forsyth 	res->nstore.fmt = 'X';
16974a4d8c2SCharles.Forsyth 	res->type = TINT;
17074a4d8c2SCharles.Forsyth 
17174a4d8c2SCharles.Forsyth 	/* Try and set comt */
17274a4d8c2SCharles.Forsyth 	for(f = n->sym->local; f; f = f->next) {
17374a4d8c2SCharles.Forsyth 		if(f->var == lp->sym) {
17474a4d8c2SCharles.Forsyth 			res->nstore.comt = f->type;
17574a4d8c2SCharles.Forsyth 			res->nstore.fmt = 'a';
17674a4d8c2SCharles.Forsyth 			break;
17774a4d8c2SCharles.Forsyth 		}
17874a4d8c2SCharles.Forsyth 	}
17974a4d8c2SCharles.Forsyth }
18074a4d8c2SCharles.Forsyth 
18174a4d8c2SCharles.Forsyth void
oindex(Node * n,Node * res)18274a4d8c2SCharles.Forsyth oindex(Node *n, Node *res)
18374a4d8c2SCharles.Forsyth {
18474a4d8c2SCharles.Forsyth 	Node l, r;
18574a4d8c2SCharles.Forsyth 
18674a4d8c2SCharles.Forsyth 	expr(n->left, &l);
18774a4d8c2SCharles.Forsyth 	expr(n->right, &r);
18874a4d8c2SCharles.Forsyth 
18974a4d8c2SCharles.Forsyth 	if(r.type != TINT)
19074a4d8c2SCharles.Forsyth 		error("bad type for []");
19174a4d8c2SCharles.Forsyth 
19274a4d8c2SCharles.Forsyth 	switch(l.type) {
19374a4d8c2SCharles.Forsyth 	default:
19474a4d8c2SCharles.Forsyth 		error("lhs[] has bad type");
19574a4d8c2SCharles.Forsyth 	case TINT:
19674a4d8c2SCharles.Forsyth 		indir(cormap, l.nstore.u0.sival+(r.nstore.u0.sival*fsize[l.nstore.fmt]), l.nstore.fmt, res);
19774a4d8c2SCharles.Forsyth 		res->nstore.comt = l.nstore.comt;
19874a4d8c2SCharles.Forsyth 		res->nstore.fmt = l.nstore.fmt;
19974a4d8c2SCharles.Forsyth 		break;
20074a4d8c2SCharles.Forsyth 	case TLIST:
20174a4d8c2SCharles.Forsyth 		nthelem(l.nstore.u0.sl, r.nstore.u0.sival, res);
20274a4d8c2SCharles.Forsyth 		break;
20374a4d8c2SCharles.Forsyth 	case TSTRING:
20474a4d8c2SCharles.Forsyth 		res->nstore.u0.sival = 0;
20574a4d8c2SCharles.Forsyth 		if(r.nstore.u0.sival >= 0 && r.nstore.u0.sival < l.nstore.u0.sstring->len) {
20674a4d8c2SCharles.Forsyth 			int xx8;	/* to get around bug in vc */
20774a4d8c2SCharles.Forsyth 			xx8 = r.nstore.u0.sival;
20874a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sstring->string[xx8];
20974a4d8c2SCharles.Forsyth 		}
21074a4d8c2SCharles.Forsyth 		res->op = OCONST;
21174a4d8c2SCharles.Forsyth 		res->type = TINT;
21274a4d8c2SCharles.Forsyth 		res->nstore.fmt = 'c';
21374a4d8c2SCharles.Forsyth 		break;
21474a4d8c2SCharles.Forsyth 	}
21574a4d8c2SCharles.Forsyth }
21674a4d8c2SCharles.Forsyth 
21774a4d8c2SCharles.Forsyth void
oappend(Node * n,Node * res)21874a4d8c2SCharles.Forsyth oappend(Node *n, Node *res)
21974a4d8c2SCharles.Forsyth {
22074a4d8c2SCharles.Forsyth 	Node r, l;
22174a4d8c2SCharles.Forsyth 
22274a4d8c2SCharles.Forsyth 	expr(n->left, &l);
22374a4d8c2SCharles.Forsyth 	expr(n->right, &r);
22474a4d8c2SCharles.Forsyth 	if(l.type != TLIST)
22574a4d8c2SCharles.Forsyth 		error("must append to list");
22674a4d8c2SCharles.Forsyth 	append(res, &l, &r);
22774a4d8c2SCharles.Forsyth }
22874a4d8c2SCharles.Forsyth 
22974a4d8c2SCharles.Forsyth void
odelete(Node * n,Node * res)23074a4d8c2SCharles.Forsyth odelete(Node *n, Node *res)
23174a4d8c2SCharles.Forsyth {
23274a4d8c2SCharles.Forsyth 	Node l, r;
23374a4d8c2SCharles.Forsyth 
23474a4d8c2SCharles.Forsyth 	expr(n->left, &l);
23574a4d8c2SCharles.Forsyth 	expr(n->right, &r);
23674a4d8c2SCharles.Forsyth 	if(l.type != TLIST)
23774a4d8c2SCharles.Forsyth 		error("must delete from list");
23874a4d8c2SCharles.Forsyth 	if(r.type != TINT)
23974a4d8c2SCharles.Forsyth 		error("delete index must be integer");
24074a4d8c2SCharles.Forsyth 
24174a4d8c2SCharles.Forsyth 	delete(l.nstore.u0.sl, r.nstore.u0.sival, res);
24274a4d8c2SCharles.Forsyth }
24374a4d8c2SCharles.Forsyth 
24474a4d8c2SCharles.Forsyth void
ohead(Node * n,Node * res)24574a4d8c2SCharles.Forsyth ohead(Node *n, Node *res)
24674a4d8c2SCharles.Forsyth {
24774a4d8c2SCharles.Forsyth 	Node l;
24874a4d8c2SCharles.Forsyth 
24974a4d8c2SCharles.Forsyth 	expr(n->left, &l);
25074a4d8c2SCharles.Forsyth 	if(l.type != TLIST)
25174a4d8c2SCharles.Forsyth 		error("head needs list");
25274a4d8c2SCharles.Forsyth 	res->op = OCONST;
25374a4d8c2SCharles.Forsyth 	if(l.nstore.u0.sl) {
25474a4d8c2SCharles.Forsyth 		res->type = l.nstore.u0.sl->type;
25574a4d8c2SCharles.Forsyth 		res->nstore = l.nstore.u0.sl->lstore;
25674a4d8c2SCharles.Forsyth 	}
25774a4d8c2SCharles.Forsyth 	else {
25874a4d8c2SCharles.Forsyth 		res->type = TLIST;
25974a4d8c2SCharles.Forsyth 		res->nstore.u0.sl = 0;
26074a4d8c2SCharles.Forsyth 	}
26174a4d8c2SCharles.Forsyth }
26274a4d8c2SCharles.Forsyth 
26374a4d8c2SCharles.Forsyth void
otail(Node * n,Node * res)26474a4d8c2SCharles.Forsyth otail(Node *n, Node *res)
26574a4d8c2SCharles.Forsyth {
26674a4d8c2SCharles.Forsyth 	Node l;
26774a4d8c2SCharles.Forsyth 
26874a4d8c2SCharles.Forsyth 	expr(n->left, &l);
26974a4d8c2SCharles.Forsyth 	if(l.type != TLIST)
27074a4d8c2SCharles.Forsyth 		error("tail needs list");
27174a4d8c2SCharles.Forsyth 	res->op = OCONST;
27274a4d8c2SCharles.Forsyth 	res->type = TLIST;
27374a4d8c2SCharles.Forsyth 	if(l.nstore.u0.sl)
27474a4d8c2SCharles.Forsyth 		res->nstore.u0.sl = l.nstore.u0.sl->next;
27574a4d8c2SCharles.Forsyth 	else
27674a4d8c2SCharles.Forsyth 		res->nstore.u0.sl = 0;
27774a4d8c2SCharles.Forsyth }
27874a4d8c2SCharles.Forsyth 
27974a4d8c2SCharles.Forsyth void
oconst(Node * n,Node * res)28074a4d8c2SCharles.Forsyth oconst(Node *n, Node *res)
28174a4d8c2SCharles.Forsyth {
28274a4d8c2SCharles.Forsyth 	res->op = OCONST;
28374a4d8c2SCharles.Forsyth 	res->type = n->type;
28474a4d8c2SCharles.Forsyth 	res->nstore = n->nstore;
28574a4d8c2SCharles.Forsyth 	res->nstore.comt = n->nstore.comt;
28674a4d8c2SCharles.Forsyth }
28774a4d8c2SCharles.Forsyth 
28874a4d8c2SCharles.Forsyth void
oname(Node * n,Node * res)28974a4d8c2SCharles.Forsyth oname(Node *n, Node *res)
29074a4d8c2SCharles.Forsyth {
29174a4d8c2SCharles.Forsyth 	Value *v;
29274a4d8c2SCharles.Forsyth 
29374a4d8c2SCharles.Forsyth 	v = n->sym->v;
29474a4d8c2SCharles.Forsyth 	if(v->set == 0)
29574a4d8c2SCharles.Forsyth 		error("%s used but not set", n->sym->name);
29674a4d8c2SCharles.Forsyth 	res->op = OCONST;
29774a4d8c2SCharles.Forsyth 	res->type = v->type;
29874a4d8c2SCharles.Forsyth 	res->nstore = v->vstore;
29974a4d8c2SCharles.Forsyth 	res->nstore.comt = v->vstore.comt;
30074a4d8c2SCharles.Forsyth }
30174a4d8c2SCharles.Forsyth 
30274a4d8c2SCharles.Forsyth void
octruct(Node * n,Node * res)30374a4d8c2SCharles.Forsyth octruct(Node *n, Node *res)
30474a4d8c2SCharles.Forsyth {
30574a4d8c2SCharles.Forsyth 	res->op = OCONST;
30674a4d8c2SCharles.Forsyth 	res->type = TLIST;
30774a4d8c2SCharles.Forsyth 	res->nstore.u0.sl = construct(n->left);
30874a4d8c2SCharles.Forsyth }
30974a4d8c2SCharles.Forsyth 
31074a4d8c2SCharles.Forsyth void
oasgn(Node * n,Node * res)31174a4d8c2SCharles.Forsyth oasgn(Node *n, Node *res)
31274a4d8c2SCharles.Forsyth {
31374a4d8c2SCharles.Forsyth 	Node *lp, r;
31474a4d8c2SCharles.Forsyth 	Value *v;
31574a4d8c2SCharles.Forsyth 
31674a4d8c2SCharles.Forsyth 	lp = n->left;
31774a4d8c2SCharles.Forsyth 	switch(lp->op) {
31874a4d8c2SCharles.Forsyth 	case OINDM:
31974a4d8c2SCharles.Forsyth 		windir(cormap, lp->left, n->right, res);
32074a4d8c2SCharles.Forsyth 		break;
32174a4d8c2SCharles.Forsyth 	case OINDC:
32274a4d8c2SCharles.Forsyth 		windir(symmap, lp->left, n->right, res);
32374a4d8c2SCharles.Forsyth 		break;
32474a4d8c2SCharles.Forsyth 	default:
32574a4d8c2SCharles.Forsyth 		chklval(lp);
32674a4d8c2SCharles.Forsyth 		v = lp->sym->v;
32774a4d8c2SCharles.Forsyth 		expr(n->right, &r);
32874a4d8c2SCharles.Forsyth 		v->set = 1;
32974a4d8c2SCharles.Forsyth 		v->type = r.type;
33074a4d8c2SCharles.Forsyth 		v->vstore = r.nstore;
33174a4d8c2SCharles.Forsyth 		res->op = OCONST;
33274a4d8c2SCharles.Forsyth 		res->type = v->type;
33374a4d8c2SCharles.Forsyth 		res->nstore = v->vstore;
33474a4d8c2SCharles.Forsyth 		res->nstore.comt = v->vstore.comt;
33574a4d8c2SCharles.Forsyth 	}
33674a4d8c2SCharles.Forsyth }
33774a4d8c2SCharles.Forsyth 
33874a4d8c2SCharles.Forsyth void
oadd(Node * n,Node * res)33974a4d8c2SCharles.Forsyth oadd(Node *n, Node *res)
34074a4d8c2SCharles.Forsyth {
34174a4d8c2SCharles.Forsyth 	Node l, r;
34274a4d8c2SCharles.Forsyth 
34374a4d8c2SCharles.Forsyth 	expr(n->left, &l);
34474a4d8c2SCharles.Forsyth 	expr(n->right, &r);
34574a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
34674a4d8c2SCharles.Forsyth 	res->op = OCONST;
34774a4d8c2SCharles.Forsyth 	res->type = TFLOAT;
34874a4d8c2SCharles.Forsyth 	switch(l.type) {
34974a4d8c2SCharles.Forsyth 	default:
35074a4d8c2SCharles.Forsyth 		error("bad lhs type +");
35174a4d8c2SCharles.Forsyth 	case TINT:
35274a4d8c2SCharles.Forsyth 		switch(r.type) {
35374a4d8c2SCharles.Forsyth 		case TINT:
35474a4d8c2SCharles.Forsyth 			res->type = TINT;
35574a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival+r.nstore.u0.sival;
35674a4d8c2SCharles.Forsyth 			break;
35774a4d8c2SCharles.Forsyth 		case TFLOAT:
35874a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sival+r.nstore.u0.sfval;
35974a4d8c2SCharles.Forsyth 			break;
36074a4d8c2SCharles.Forsyth 		default:
36174a4d8c2SCharles.Forsyth 			error("bad rhs type +");
36274a4d8c2SCharles.Forsyth 		}
36374a4d8c2SCharles.Forsyth 		break;
36474a4d8c2SCharles.Forsyth 	case TFLOAT:
36574a4d8c2SCharles.Forsyth 		switch(r.type) {
36674a4d8c2SCharles.Forsyth 		case TINT:
36774a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sfval+r.nstore.u0.sival;
36874a4d8c2SCharles.Forsyth 			break;
36974a4d8c2SCharles.Forsyth 		case TFLOAT:
37074a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sfval+r.nstore.u0.sfval;
37174a4d8c2SCharles.Forsyth 			break;
37274a4d8c2SCharles.Forsyth 		default:
37374a4d8c2SCharles.Forsyth 			error("bad rhs type +");
37474a4d8c2SCharles.Forsyth 		}
37574a4d8c2SCharles.Forsyth 		break;
37674a4d8c2SCharles.Forsyth 	case TSTRING:
37774a4d8c2SCharles.Forsyth 		if(r.type == TSTRING) {
37874a4d8c2SCharles.Forsyth 			res->type = TSTRING;
37974a4d8c2SCharles.Forsyth 			res->nstore.fmt = 's';
38074a4d8c2SCharles.Forsyth 			res->nstore.u0.sstring = stradd(l.nstore.u0.sstring, r.nstore.u0.sstring);
38174a4d8c2SCharles.Forsyth 			break;
38274a4d8c2SCharles.Forsyth 		}
38374a4d8c2SCharles.Forsyth 		error("bad rhs for +");
38474a4d8c2SCharles.Forsyth 	case TLIST:
38574a4d8c2SCharles.Forsyth 		res->type = TLIST;
38674a4d8c2SCharles.Forsyth 		switch(r.type) {
38774a4d8c2SCharles.Forsyth 		case TLIST:
38874a4d8c2SCharles.Forsyth 			res->nstore.u0.sl = addlist(l.nstore.u0.sl, r.nstore.u0.sl);
38974a4d8c2SCharles.Forsyth 			break;
39074a4d8c2SCharles.Forsyth 		default:
39174a4d8c2SCharles.Forsyth 			r.left = 0;
39274a4d8c2SCharles.Forsyth 			r.right = 0;
39374a4d8c2SCharles.Forsyth 			res->nstore.u0.sl = addlist(l.nstore.u0.sl, construct(&r));
39474a4d8c2SCharles.Forsyth 			break;
39574a4d8c2SCharles.Forsyth 		}
39674a4d8c2SCharles.Forsyth 	}
39774a4d8c2SCharles.Forsyth }
39874a4d8c2SCharles.Forsyth 
39974a4d8c2SCharles.Forsyth void
osub(Node * n,Node * res)40074a4d8c2SCharles.Forsyth osub(Node *n, Node *res)
40174a4d8c2SCharles.Forsyth {
40274a4d8c2SCharles.Forsyth 	Node l, r;
40374a4d8c2SCharles.Forsyth 
40474a4d8c2SCharles.Forsyth 	expr(n->left, &l);
40574a4d8c2SCharles.Forsyth 	expr(n->right, &r);
40674a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
40774a4d8c2SCharles.Forsyth 	res->op = OCONST;
40874a4d8c2SCharles.Forsyth 	res->type = TFLOAT;
40974a4d8c2SCharles.Forsyth 	switch(l.type) {
41074a4d8c2SCharles.Forsyth 	default:
41174a4d8c2SCharles.Forsyth 		error("bad lhs type -");
41274a4d8c2SCharles.Forsyth 	case TINT:
41374a4d8c2SCharles.Forsyth 		switch(r.type) {
41474a4d8c2SCharles.Forsyth 		case TINT:
41574a4d8c2SCharles.Forsyth 			res->type = TINT;
41674a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival-r.nstore.u0.sival;
41774a4d8c2SCharles.Forsyth 			break;
41874a4d8c2SCharles.Forsyth 		case TFLOAT:
41974a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sival-r.nstore.u0.sfval;
42074a4d8c2SCharles.Forsyth 			break;
42174a4d8c2SCharles.Forsyth 		default:
42274a4d8c2SCharles.Forsyth 			error("bad rhs type -");
42374a4d8c2SCharles.Forsyth 		}
42474a4d8c2SCharles.Forsyth 		break;
42574a4d8c2SCharles.Forsyth 	case TFLOAT:
42674a4d8c2SCharles.Forsyth 		switch(r.type) {
42774a4d8c2SCharles.Forsyth 		case TINT:
42874a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sfval-r.nstore.u0.sival;
42974a4d8c2SCharles.Forsyth 			break;
43074a4d8c2SCharles.Forsyth 		case TFLOAT:
43174a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sfval-r.nstore.u0.sfval;
43274a4d8c2SCharles.Forsyth 			break;
43374a4d8c2SCharles.Forsyth 		default:
43474a4d8c2SCharles.Forsyth 			error("bad rhs type -");
43574a4d8c2SCharles.Forsyth 		}
43674a4d8c2SCharles.Forsyth 		break;
43774a4d8c2SCharles.Forsyth 	}
43874a4d8c2SCharles.Forsyth }
43974a4d8c2SCharles.Forsyth 
44074a4d8c2SCharles.Forsyth void
omul(Node * n,Node * res)44174a4d8c2SCharles.Forsyth omul(Node *n, Node *res)
44274a4d8c2SCharles.Forsyth {
44374a4d8c2SCharles.Forsyth 	Node l, r;
44474a4d8c2SCharles.Forsyth 
44574a4d8c2SCharles.Forsyth 	expr(n->left, &l);
44674a4d8c2SCharles.Forsyth 	expr(n->right, &r);
44774a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
44874a4d8c2SCharles.Forsyth 	res->op = OCONST;
44974a4d8c2SCharles.Forsyth 	res->type = TFLOAT;
45074a4d8c2SCharles.Forsyth 	switch(l.type) {
45174a4d8c2SCharles.Forsyth 	default:
45274a4d8c2SCharles.Forsyth 		error("bad lhs type *");
45374a4d8c2SCharles.Forsyth 	case TINT:
45474a4d8c2SCharles.Forsyth 		switch(r.type) {
45574a4d8c2SCharles.Forsyth 		case TINT:
45674a4d8c2SCharles.Forsyth 			res->type = TINT;
45774a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival*r.nstore.u0.sival;
45874a4d8c2SCharles.Forsyth 			break;
45974a4d8c2SCharles.Forsyth 		case TFLOAT:
46074a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sival*r.nstore.u0.sfval;
46174a4d8c2SCharles.Forsyth 			break;
46274a4d8c2SCharles.Forsyth 		default:
46374a4d8c2SCharles.Forsyth 			error("bad rhs type *");
46474a4d8c2SCharles.Forsyth 		}
46574a4d8c2SCharles.Forsyth 		break;
46674a4d8c2SCharles.Forsyth 	case TFLOAT:
46774a4d8c2SCharles.Forsyth 		switch(r.type) {
46874a4d8c2SCharles.Forsyth 		case TINT:
46974a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sfval*r.nstore.u0.sival;
47074a4d8c2SCharles.Forsyth 			break;
47174a4d8c2SCharles.Forsyth 		case TFLOAT:
47274a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sfval*r.nstore.u0.sfval;
47374a4d8c2SCharles.Forsyth 			break;
47474a4d8c2SCharles.Forsyth 		default:
47574a4d8c2SCharles.Forsyth 			error("bad rhs type *");
47674a4d8c2SCharles.Forsyth 		}
47774a4d8c2SCharles.Forsyth 		break;
47874a4d8c2SCharles.Forsyth 	}
47974a4d8c2SCharles.Forsyth }
48074a4d8c2SCharles.Forsyth 
48174a4d8c2SCharles.Forsyth void
odiv(Node * n,Node * res)48274a4d8c2SCharles.Forsyth odiv(Node *n, Node *res)
48374a4d8c2SCharles.Forsyth {
48474a4d8c2SCharles.Forsyth 	Node l, r;
48574a4d8c2SCharles.Forsyth 
48674a4d8c2SCharles.Forsyth 	expr(n->left, &l);
48774a4d8c2SCharles.Forsyth 	expr(n->right, &r);
48874a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
48974a4d8c2SCharles.Forsyth 	res->op = OCONST;
49074a4d8c2SCharles.Forsyth 	res->type = TFLOAT;
49174a4d8c2SCharles.Forsyth 	switch(l.type) {
49274a4d8c2SCharles.Forsyth 	default:
49374a4d8c2SCharles.Forsyth 		error("bad lhs type /");
49474a4d8c2SCharles.Forsyth 	case TINT:
49574a4d8c2SCharles.Forsyth 		switch(r.type) {
49674a4d8c2SCharles.Forsyth 		case TINT:
49774a4d8c2SCharles.Forsyth 			res->type = TINT;
49874a4d8c2SCharles.Forsyth 			if(r.nstore.u0.sival == 0)
49974a4d8c2SCharles.Forsyth 				error("zero divide");
50074a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival/r.nstore.u0.sival;
50174a4d8c2SCharles.Forsyth 			break;
50274a4d8c2SCharles.Forsyth 		case TFLOAT:
50374a4d8c2SCharles.Forsyth 			if(r.nstore.u0.sfval == 0)
50474a4d8c2SCharles.Forsyth 				error("zero divide");
50574a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sival/r.nstore.u0.sfval;
50674a4d8c2SCharles.Forsyth 			break;
50774a4d8c2SCharles.Forsyth 		default:
50874a4d8c2SCharles.Forsyth 			error("bad rhs type /");
50974a4d8c2SCharles.Forsyth 		}
51074a4d8c2SCharles.Forsyth 		break;
51174a4d8c2SCharles.Forsyth 	case TFLOAT:
51274a4d8c2SCharles.Forsyth 		switch(r.type) {
51374a4d8c2SCharles.Forsyth 		case TINT:
51474a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sfval/r.nstore.u0.sival;
51574a4d8c2SCharles.Forsyth 			break;
51674a4d8c2SCharles.Forsyth 		case TFLOAT:
51774a4d8c2SCharles.Forsyth 			res->nstore.u0.sfval = l.nstore.u0.sfval/r.nstore.u0.sfval;
51874a4d8c2SCharles.Forsyth 			break;
51974a4d8c2SCharles.Forsyth 		default:
52074a4d8c2SCharles.Forsyth 			error("bad rhs type /");
52174a4d8c2SCharles.Forsyth 		}
52274a4d8c2SCharles.Forsyth 		break;
52374a4d8c2SCharles.Forsyth 	}
52474a4d8c2SCharles.Forsyth }
52574a4d8c2SCharles.Forsyth 
52674a4d8c2SCharles.Forsyth void
omod(Node * n,Node * res)52774a4d8c2SCharles.Forsyth omod(Node *n, Node *res)
52874a4d8c2SCharles.Forsyth {
52974a4d8c2SCharles.Forsyth 	Node l, r;
53074a4d8c2SCharles.Forsyth 
53174a4d8c2SCharles.Forsyth 	expr(n->left, &l);
53274a4d8c2SCharles.Forsyth 	expr(n->right, &r);
53374a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
53474a4d8c2SCharles.Forsyth 	res->op = OCONST;
53574a4d8c2SCharles.Forsyth 	res->type = TINT;
53674a4d8c2SCharles.Forsyth 	if(l.type != TINT || r.type != TINT)
53774a4d8c2SCharles.Forsyth 		error("bad expr type %");
53874a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = l.nstore.u0.sival%r.nstore.u0.sival;
53974a4d8c2SCharles.Forsyth }
54074a4d8c2SCharles.Forsyth 
54174a4d8c2SCharles.Forsyth void
olsh(Node * n,Node * res)54274a4d8c2SCharles.Forsyth olsh(Node *n, Node *res)
54374a4d8c2SCharles.Forsyth {
54474a4d8c2SCharles.Forsyth 	Node l, r;
54574a4d8c2SCharles.Forsyth 
54674a4d8c2SCharles.Forsyth 	expr(n->left, &l);
54774a4d8c2SCharles.Forsyth 	expr(n->right, &r);
54874a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
54974a4d8c2SCharles.Forsyth 	res->op = OCONST;
55074a4d8c2SCharles.Forsyth 	res->type = TINT;
55174a4d8c2SCharles.Forsyth 	if(l.type != TINT || r.type != TINT)
55274a4d8c2SCharles.Forsyth 		error("bad expr type <<");
55374a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = l.nstore.u0.sival<<r.nstore.u0.sival;
55474a4d8c2SCharles.Forsyth }
55574a4d8c2SCharles.Forsyth 
55674a4d8c2SCharles.Forsyth void
orsh(Node * n,Node * res)55774a4d8c2SCharles.Forsyth orsh(Node *n, Node *res)
55874a4d8c2SCharles.Forsyth {
55974a4d8c2SCharles.Forsyth 	Node l, r;
56074a4d8c2SCharles.Forsyth 
56174a4d8c2SCharles.Forsyth 	expr(n->left, &l);
56274a4d8c2SCharles.Forsyth 	expr(n->right, &r);
56374a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
56474a4d8c2SCharles.Forsyth 	res->op = OCONST;
56574a4d8c2SCharles.Forsyth 	res->type = TINT;
56674a4d8c2SCharles.Forsyth 	if(l.type != TINT || r.type != TINT)
56774a4d8c2SCharles.Forsyth 		error("bad expr type >>");
56874a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = l.nstore.u0.sival>>r.nstore.u0.sival;
56974a4d8c2SCharles.Forsyth }
57074a4d8c2SCharles.Forsyth 
57174a4d8c2SCharles.Forsyth void
olt(Node * n,Node * res)57274a4d8c2SCharles.Forsyth olt(Node *n, Node *res)
57374a4d8c2SCharles.Forsyth {
57474a4d8c2SCharles.Forsyth 	Node l, r;
57574a4d8c2SCharles.Forsyth 
57674a4d8c2SCharles.Forsyth 	expr(n->left, &l);
57774a4d8c2SCharles.Forsyth 	expr(n->right, &r);
57874a4d8c2SCharles.Forsyth 
57974a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
58074a4d8c2SCharles.Forsyth 	res->op = OCONST;
58174a4d8c2SCharles.Forsyth 	res->type = TINT;
58274a4d8c2SCharles.Forsyth 	switch(l.type) {
58374a4d8c2SCharles.Forsyth 	default:
58474a4d8c2SCharles.Forsyth 		error("bad lhs type <");
58574a4d8c2SCharles.Forsyth 	case TINT:
58674a4d8c2SCharles.Forsyth 		switch(r.type) {
58774a4d8c2SCharles.Forsyth 		case TINT:
58874a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival < r.nstore.u0.sival;
58974a4d8c2SCharles.Forsyth 			break;
59074a4d8c2SCharles.Forsyth 		case TFLOAT:
59174a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival < r.nstore.u0.sfval;
59274a4d8c2SCharles.Forsyth 			break;
59374a4d8c2SCharles.Forsyth 		default:
59474a4d8c2SCharles.Forsyth 			error("bad rhs type <");
59574a4d8c2SCharles.Forsyth 		}
59674a4d8c2SCharles.Forsyth 		break;
59774a4d8c2SCharles.Forsyth 	case TFLOAT:
59874a4d8c2SCharles.Forsyth 		switch(r.type) {
59974a4d8c2SCharles.Forsyth 		case TINT:
60074a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval < r.nstore.u0.sival;
60174a4d8c2SCharles.Forsyth 			break;
60274a4d8c2SCharles.Forsyth 		case TFLOAT:
60374a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval < r.nstore.u0.sfval;
60474a4d8c2SCharles.Forsyth 			break;
60574a4d8c2SCharles.Forsyth 		default:
60674a4d8c2SCharles.Forsyth 			error("bad rhs type <");
60774a4d8c2SCharles.Forsyth 		}
60874a4d8c2SCharles.Forsyth 		break;
60974a4d8c2SCharles.Forsyth 	}
61074a4d8c2SCharles.Forsyth }
61174a4d8c2SCharles.Forsyth 
61274a4d8c2SCharles.Forsyth void
ogt(Node * n,Node * res)61374a4d8c2SCharles.Forsyth ogt(Node *n, Node *res)
61474a4d8c2SCharles.Forsyth {
61574a4d8c2SCharles.Forsyth 	Node l, r;
61674a4d8c2SCharles.Forsyth 
61774a4d8c2SCharles.Forsyth 	expr(n->left, &l);
61874a4d8c2SCharles.Forsyth 	expr(n->right, &r);
61974a4d8c2SCharles.Forsyth 	res->nstore.fmt = 'D';
62074a4d8c2SCharles.Forsyth 	res->op = OCONST;
62174a4d8c2SCharles.Forsyth 	res->type = TINT;
62274a4d8c2SCharles.Forsyth 	switch(l.type) {
62374a4d8c2SCharles.Forsyth 	default:
62474a4d8c2SCharles.Forsyth 		error("bad lhs type >");
62574a4d8c2SCharles.Forsyth 	case TINT:
62674a4d8c2SCharles.Forsyth 		switch(r.type) {
62774a4d8c2SCharles.Forsyth 		case TINT:
62874a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival > r.nstore.u0.sival;
62974a4d8c2SCharles.Forsyth 			break;
63074a4d8c2SCharles.Forsyth 		case TFLOAT:
63174a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival > r.nstore.u0.sfval;
63274a4d8c2SCharles.Forsyth 			break;
63374a4d8c2SCharles.Forsyth 		default:
63474a4d8c2SCharles.Forsyth 			error("bad rhs type >");
63574a4d8c2SCharles.Forsyth 		}
63674a4d8c2SCharles.Forsyth 		break;
63774a4d8c2SCharles.Forsyth 	case TFLOAT:
63874a4d8c2SCharles.Forsyth 		switch(r.type) {
63974a4d8c2SCharles.Forsyth 		case TINT:
64074a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval > r.nstore.u0.sival;
64174a4d8c2SCharles.Forsyth 			break;
64274a4d8c2SCharles.Forsyth 		case TFLOAT:
64374a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval > r.nstore.u0.sfval;
64474a4d8c2SCharles.Forsyth 			break;
64574a4d8c2SCharles.Forsyth 		default:
64674a4d8c2SCharles.Forsyth 			error("bad rhs type >");
64774a4d8c2SCharles.Forsyth 		}
64874a4d8c2SCharles.Forsyth 		break;
64974a4d8c2SCharles.Forsyth 	}
65074a4d8c2SCharles.Forsyth }
65174a4d8c2SCharles.Forsyth 
65274a4d8c2SCharles.Forsyth void
oleq(Node * n,Node * res)65374a4d8c2SCharles.Forsyth oleq(Node *n, Node *res)
65474a4d8c2SCharles.Forsyth {
65574a4d8c2SCharles.Forsyth 	Node l, r;
65674a4d8c2SCharles.Forsyth 
65774a4d8c2SCharles.Forsyth 	expr(n->left, &l);
65874a4d8c2SCharles.Forsyth 	expr(n->right, &r);
65974a4d8c2SCharles.Forsyth 	res->nstore.fmt = 'D';
66074a4d8c2SCharles.Forsyth 	res->op = OCONST;
66174a4d8c2SCharles.Forsyth 	res->type = TINT;
66274a4d8c2SCharles.Forsyth 	switch(l.type) {
66374a4d8c2SCharles.Forsyth 	default:
66474a4d8c2SCharles.Forsyth 		error("bad expr type <=");
66574a4d8c2SCharles.Forsyth 	case TINT:
66674a4d8c2SCharles.Forsyth 		switch(r.type) {
66774a4d8c2SCharles.Forsyth 		case TINT:
66874a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival <= r.nstore.u0.sival;
66974a4d8c2SCharles.Forsyth 			break;
67074a4d8c2SCharles.Forsyth 		case TFLOAT:
67174a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival <= r.nstore.u0.sfval;
67274a4d8c2SCharles.Forsyth 			break;
67374a4d8c2SCharles.Forsyth 		default:
67474a4d8c2SCharles.Forsyth 			error("bad expr type <=");
67574a4d8c2SCharles.Forsyth 		}
67674a4d8c2SCharles.Forsyth 		break;
67774a4d8c2SCharles.Forsyth 	case TFLOAT:
67874a4d8c2SCharles.Forsyth 		switch(r.type) {
67974a4d8c2SCharles.Forsyth 		case TINT:
68074a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval <= r.nstore.u0.sival;
68174a4d8c2SCharles.Forsyth 			break;
68274a4d8c2SCharles.Forsyth 		case TFLOAT:
68374a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval <= r.nstore.u0.sfval;
68474a4d8c2SCharles.Forsyth 			break;
68574a4d8c2SCharles.Forsyth 		default:
68674a4d8c2SCharles.Forsyth 			error("bad expr type <=");
68774a4d8c2SCharles.Forsyth 		}
68874a4d8c2SCharles.Forsyth 		break;
68974a4d8c2SCharles.Forsyth 	}
69074a4d8c2SCharles.Forsyth }
69174a4d8c2SCharles.Forsyth 
69274a4d8c2SCharles.Forsyth void
ogeq(Node * n,Node * res)69374a4d8c2SCharles.Forsyth ogeq(Node *n, Node *res)
69474a4d8c2SCharles.Forsyth {
69574a4d8c2SCharles.Forsyth 	Node l, r;
69674a4d8c2SCharles.Forsyth 
69774a4d8c2SCharles.Forsyth 	expr(n->left, &l);
69874a4d8c2SCharles.Forsyth 	expr(n->right, &r);
69974a4d8c2SCharles.Forsyth 	res->nstore.fmt = 'D';
70074a4d8c2SCharles.Forsyth 	res->op = OCONST;
70174a4d8c2SCharles.Forsyth 	res->type = TINT;
70274a4d8c2SCharles.Forsyth 	switch(l.type) {
70374a4d8c2SCharles.Forsyth 	default:
70474a4d8c2SCharles.Forsyth 		error("bad lhs type >=");
70574a4d8c2SCharles.Forsyth 	case TINT:
70674a4d8c2SCharles.Forsyth 		switch(r.type) {
70774a4d8c2SCharles.Forsyth 		case TINT:
70874a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival >= r.nstore.u0.sival;
70974a4d8c2SCharles.Forsyth 			break;
71074a4d8c2SCharles.Forsyth 		case TFLOAT:
71174a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival >= r.nstore.u0.sfval;
71274a4d8c2SCharles.Forsyth 			break;
71374a4d8c2SCharles.Forsyth 		default:
71474a4d8c2SCharles.Forsyth 			error("bad rhs type >=");
71574a4d8c2SCharles.Forsyth 		}
71674a4d8c2SCharles.Forsyth 		break;
71774a4d8c2SCharles.Forsyth 	case TFLOAT:
71874a4d8c2SCharles.Forsyth 		switch(r.type) {
71974a4d8c2SCharles.Forsyth 		case TINT:
72074a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval >= r.nstore.u0.sival;
72174a4d8c2SCharles.Forsyth 			break;
72274a4d8c2SCharles.Forsyth 		case TFLOAT:
72374a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval >= r.nstore.u0.sfval;
72474a4d8c2SCharles.Forsyth 			break;
72574a4d8c2SCharles.Forsyth 		default:
72674a4d8c2SCharles.Forsyth 			error("bad rhs type >=");
72774a4d8c2SCharles.Forsyth 		}
72874a4d8c2SCharles.Forsyth 		break;
72974a4d8c2SCharles.Forsyth 	}
73074a4d8c2SCharles.Forsyth }
73174a4d8c2SCharles.Forsyth 
73274a4d8c2SCharles.Forsyth void
oeq(Node * n,Node * res)73374a4d8c2SCharles.Forsyth oeq(Node *n, Node *res)
73474a4d8c2SCharles.Forsyth {
73574a4d8c2SCharles.Forsyth 	Node l, r;
73674a4d8c2SCharles.Forsyth 
73774a4d8c2SCharles.Forsyth 	expr(n->left, &l);
73874a4d8c2SCharles.Forsyth 	expr(n->right, &r);
73974a4d8c2SCharles.Forsyth 	res->nstore.fmt = 'D';
74074a4d8c2SCharles.Forsyth 	res->op = OCONST;
74174a4d8c2SCharles.Forsyth 	res->type = TINT;
74274a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = 0;
74374a4d8c2SCharles.Forsyth 	switch(l.type) {
74474a4d8c2SCharles.Forsyth 	default:
74574a4d8c2SCharles.Forsyth 		break;
74674a4d8c2SCharles.Forsyth 	case TINT:
74774a4d8c2SCharles.Forsyth 		switch(r.type) {
74874a4d8c2SCharles.Forsyth 		case TINT:
74974a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival == r.nstore.u0.sival;
75074a4d8c2SCharles.Forsyth 			break;
75174a4d8c2SCharles.Forsyth 		case TFLOAT:
75274a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sival == r.nstore.u0.sfval;
75374a4d8c2SCharles.Forsyth 			break;
75474a4d8c2SCharles.Forsyth 		default:
75574a4d8c2SCharles.Forsyth 			break;
75674a4d8c2SCharles.Forsyth 		}
75774a4d8c2SCharles.Forsyth 		break;
75874a4d8c2SCharles.Forsyth 	case TFLOAT:
75974a4d8c2SCharles.Forsyth 		switch(r.type) {
76074a4d8c2SCharles.Forsyth 		case TINT:
76174a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval == r.nstore.u0.sival;
76274a4d8c2SCharles.Forsyth 			break;
76374a4d8c2SCharles.Forsyth 		case TFLOAT:
76474a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = l.nstore.u0.sfval == r.nstore.u0.sfval;
76574a4d8c2SCharles.Forsyth 			break;
76674a4d8c2SCharles.Forsyth 		default:
76774a4d8c2SCharles.Forsyth 			break;
76874a4d8c2SCharles.Forsyth 		}
76974a4d8c2SCharles.Forsyth 		break;
77074a4d8c2SCharles.Forsyth 	case TSTRING:
77174a4d8c2SCharles.Forsyth 		if(r.type == TSTRING) {
77274a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = scmp(r.nstore.u0.sstring, l.nstore.u0.sstring);
77374a4d8c2SCharles.Forsyth 			break;
77474a4d8c2SCharles.Forsyth 		}
77574a4d8c2SCharles.Forsyth 		break;
77674a4d8c2SCharles.Forsyth 	case TLIST:
77774a4d8c2SCharles.Forsyth 		if(r.type == TLIST) {
77874a4d8c2SCharles.Forsyth 			res->nstore.u0.sival = listcmp(l.nstore.u0.sl, r.nstore.u0.sl);
77974a4d8c2SCharles.Forsyth 			break;
78074a4d8c2SCharles.Forsyth 		}
78174a4d8c2SCharles.Forsyth 		break;
78274a4d8c2SCharles.Forsyth 	}
78374a4d8c2SCharles.Forsyth 	if(n->op == ONEQ)
78474a4d8c2SCharles.Forsyth 		res->nstore.u0.sival = !res->nstore.u0.sival;
78574a4d8c2SCharles.Forsyth }
78674a4d8c2SCharles.Forsyth 
78774a4d8c2SCharles.Forsyth 
78874a4d8c2SCharles.Forsyth void
oland(Node * n,Node * res)78974a4d8c2SCharles.Forsyth oland(Node *n, Node *res)
79074a4d8c2SCharles.Forsyth {
79174a4d8c2SCharles.Forsyth 	Node l, r;
79274a4d8c2SCharles.Forsyth 
79374a4d8c2SCharles.Forsyth 	expr(n->left, &l);
79474a4d8c2SCharles.Forsyth 	expr(n->right, &r);
79574a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
79674a4d8c2SCharles.Forsyth 	res->op = OCONST;
79774a4d8c2SCharles.Forsyth 	res->type = TINT;
79874a4d8c2SCharles.Forsyth 	if(l.type != TINT || r.type != TINT)
79974a4d8c2SCharles.Forsyth 		error("bad expr type &");
80074a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = l.nstore.u0.sival&r.nstore.u0.sival;
80174a4d8c2SCharles.Forsyth }
80274a4d8c2SCharles.Forsyth 
80374a4d8c2SCharles.Forsyth void
oxor(Node * n,Node * res)80474a4d8c2SCharles.Forsyth oxor(Node *n, Node *res)
80574a4d8c2SCharles.Forsyth {
80674a4d8c2SCharles.Forsyth 	Node l, r;
80774a4d8c2SCharles.Forsyth 
80874a4d8c2SCharles.Forsyth 	expr(n->left, &l);
80974a4d8c2SCharles.Forsyth 	expr(n->right, &r);
81074a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
81174a4d8c2SCharles.Forsyth 	res->op = OCONST;
81274a4d8c2SCharles.Forsyth 	res->type = TINT;
81374a4d8c2SCharles.Forsyth 	if(l.type != TINT || r.type != TINT)
81474a4d8c2SCharles.Forsyth 		error("bad expr type ^");
81574a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = l.nstore.u0.sival^r.nstore.u0.sival;
81674a4d8c2SCharles.Forsyth }
81774a4d8c2SCharles.Forsyth 
81874a4d8c2SCharles.Forsyth void
olor(Node * n,Node * res)81974a4d8c2SCharles.Forsyth olor(Node *n, Node *res)
82074a4d8c2SCharles.Forsyth {
82174a4d8c2SCharles.Forsyth 	Node l, r;
82274a4d8c2SCharles.Forsyth 
82374a4d8c2SCharles.Forsyth 	expr(n->left, &l);
82474a4d8c2SCharles.Forsyth 	expr(n->right, &r);
82574a4d8c2SCharles.Forsyth 	res->nstore.fmt = l.nstore.fmt;
82674a4d8c2SCharles.Forsyth 	res->op = OCONST;
82774a4d8c2SCharles.Forsyth 	res->type = TINT;
82874a4d8c2SCharles.Forsyth 	if(l.type != TINT || r.type != TINT)
82974a4d8c2SCharles.Forsyth 		error("bad expr type |");
83074a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = l.nstore.u0.sival|r.nstore.u0.sival;
83174a4d8c2SCharles.Forsyth }
83274a4d8c2SCharles.Forsyth 
83374a4d8c2SCharles.Forsyth void
ocand(Node * n,Node * res)83474a4d8c2SCharles.Forsyth ocand(Node *n, Node *res)
83574a4d8c2SCharles.Forsyth {
83674a4d8c2SCharles.Forsyth 	Node l, r;
83774a4d8c2SCharles.Forsyth 
83874a4d8c2SCharles.Forsyth 	res->op = OCONST;
83974a4d8c2SCharles.Forsyth 	res->type = TINT;
84074a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = 0;
84174a4d8c2SCharles.Forsyth 	expr(n->left, &l);
84245a20ab7Sforsyth 	res->nstore.fmt = l.nstore.fmt;
843*1272589eSCharles Forsyth 	if(boolx(&l) == 0)
84474a4d8c2SCharles.Forsyth 		return;
84574a4d8c2SCharles.Forsyth 	expr(n->right, &r);
846*1272589eSCharles Forsyth 	if(boolx(&r) == 0)
84774a4d8c2SCharles.Forsyth 		return;
84874a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = 1;
84974a4d8c2SCharles.Forsyth }
85074a4d8c2SCharles.Forsyth 
85174a4d8c2SCharles.Forsyth void
onot(Node * n,Node * res)85274a4d8c2SCharles.Forsyth onot(Node *n, Node *res)
85374a4d8c2SCharles.Forsyth {
85474a4d8c2SCharles.Forsyth 	Node l;
85574a4d8c2SCharles.Forsyth 
85674a4d8c2SCharles.Forsyth 	res->op = OCONST;
85774a4d8c2SCharles.Forsyth 	res->type = TINT;
85874a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = 0;
85974a4d8c2SCharles.Forsyth 	expr(n->left, &l);
860*1272589eSCharles Forsyth 	if(boolx(&l) == 0)
86174a4d8c2SCharles.Forsyth 		res->nstore.u0.sival = 1;
86274a4d8c2SCharles.Forsyth }
86374a4d8c2SCharles.Forsyth 
86474a4d8c2SCharles.Forsyth void
ocor(Node * n,Node * res)86574a4d8c2SCharles.Forsyth ocor(Node *n, Node *res)
86674a4d8c2SCharles.Forsyth {
86774a4d8c2SCharles.Forsyth 	Node l, r;
86874a4d8c2SCharles.Forsyth 
86974a4d8c2SCharles.Forsyth 	res->op = OCONST;
87074a4d8c2SCharles.Forsyth 	res->type = TINT;
87174a4d8c2SCharles.Forsyth 	res->nstore.u0.sival = 0;
87274a4d8c2SCharles.Forsyth 	expr(n->left, &l);
873*1272589eSCharles Forsyth 	if(boolx(&l)) {
87474a4d8c2SCharles.Forsyth 		res->nstore.u0.sival = 1;
87574a4d8c2SCharles.Forsyth 		return;
87674a4d8c2SCharles.Forsyth 	}
87774a4d8c2SCharles.Forsyth 	expr(n->right, &r);
878*1272589eSCharles Forsyth 	if(boolx(&r)) {
87974a4d8c2SCharles.Forsyth 		res->nstore.u0.sival = 1;
88074a4d8c2SCharles.Forsyth 		return;
88174a4d8c2SCharles.Forsyth 	}
88274a4d8c2SCharles.Forsyth }
88374a4d8c2SCharles.Forsyth 
88474a4d8c2SCharles.Forsyth void
oeinc(Node * n,Node * res)88574a4d8c2SCharles.Forsyth oeinc(Node *n, Node *res)
88674a4d8c2SCharles.Forsyth {
88774a4d8c2SCharles.Forsyth 	Value *v;
88874a4d8c2SCharles.Forsyth 
88974a4d8c2SCharles.Forsyth 	chklval(n->left);
89074a4d8c2SCharles.Forsyth 	v = n->left->sym->v;
89174a4d8c2SCharles.Forsyth 	res->op = OCONST;
89274a4d8c2SCharles.Forsyth 	res->type = v->type;
89374a4d8c2SCharles.Forsyth 	switch(v->type) {
89474a4d8c2SCharles.Forsyth 	case TINT:
89574a4d8c2SCharles.Forsyth 		if(n->op == OEDEC)
89674a4d8c2SCharles.Forsyth 			v->vstore.u0.sival -= fmtsize(v);
89774a4d8c2SCharles.Forsyth 		else
89874a4d8c2SCharles.Forsyth 			v->vstore.u0.sival += fmtsize(v);
89974a4d8c2SCharles.Forsyth 		break;
90074a4d8c2SCharles.Forsyth 	case TFLOAT:
90174a4d8c2SCharles.Forsyth 		if(n->op == OEDEC)
90274a4d8c2SCharles.Forsyth 			v->vstore.u0.sfval--;
90374a4d8c2SCharles.Forsyth 		else
90474a4d8c2SCharles.Forsyth 			v->vstore.u0.sfval++;
90574a4d8c2SCharles.Forsyth 		break;
90674a4d8c2SCharles.Forsyth 	default:
90774a4d8c2SCharles.Forsyth 		error("bad type for pre --/++");
90874a4d8c2SCharles.Forsyth 	}
90974a4d8c2SCharles.Forsyth 	res->nstore = v->vstore;
91074a4d8c2SCharles.Forsyth }
91174a4d8c2SCharles.Forsyth 
91274a4d8c2SCharles.Forsyth void
opinc(Node * n,Node * res)91374a4d8c2SCharles.Forsyth opinc(Node *n, Node *res)
91474a4d8c2SCharles.Forsyth {
91574a4d8c2SCharles.Forsyth 	Value *v;
91674a4d8c2SCharles.Forsyth 
91774a4d8c2SCharles.Forsyth 	chklval(n->left);
91874a4d8c2SCharles.Forsyth 	v = n->left->sym->v;
91974a4d8c2SCharles.Forsyth 	res->op = OCONST;
92074a4d8c2SCharles.Forsyth 	res->type = v->type;
92174a4d8c2SCharles.Forsyth 	res->nstore = v->vstore;
92274a4d8c2SCharles.Forsyth 	switch(v->type) {
92374a4d8c2SCharles.Forsyth 	case TINT:
92474a4d8c2SCharles.Forsyth 		if(n->op == OPDEC)
92574a4d8c2SCharles.Forsyth 			v->vstore.u0.sival -= fmtsize(v);
92674a4d8c2SCharles.Forsyth 		else
92774a4d8c2SCharles.Forsyth 			v->vstore.u0.sival += fmtsize(v);
92874a4d8c2SCharles.Forsyth 		break;
92974a4d8c2SCharles.Forsyth 	case TFLOAT:
93074a4d8c2SCharles.Forsyth 		if(n->op == OPDEC)
93174a4d8c2SCharles.Forsyth 			v->vstore.u0.sfval--;
93274a4d8c2SCharles.Forsyth 		else
93374a4d8c2SCharles.Forsyth 			v->vstore.u0.sfval++;
93474a4d8c2SCharles.Forsyth 		break;
93574a4d8c2SCharles.Forsyth 	default:
93674a4d8c2SCharles.Forsyth 		error("bad type for post --/++");
93774a4d8c2SCharles.Forsyth 	}
93874a4d8c2SCharles.Forsyth }
93974a4d8c2SCharles.Forsyth 
94074a4d8c2SCharles.Forsyth void
ocall(Node * n,Node * res)94174a4d8c2SCharles.Forsyth ocall(Node *n, Node *res)
94274a4d8c2SCharles.Forsyth {
94374a4d8c2SCharles.Forsyth 	Lsym *s;
94474a4d8c2SCharles.Forsyth 	Rplace *rsav;
94574a4d8c2SCharles.Forsyth 
94674a4d8c2SCharles.Forsyth 	res->op = OCONST;		/* Default return value */
94774a4d8c2SCharles.Forsyth 	res->type = TLIST;
94874a4d8c2SCharles.Forsyth 	res->nstore.u0.sl = 0;
94974a4d8c2SCharles.Forsyth 
95074a4d8c2SCharles.Forsyth 	chklval(n->left);
95174a4d8c2SCharles.Forsyth 	s = n->left->sym;
95274a4d8c2SCharles.Forsyth 
95374a4d8c2SCharles.Forsyth 	if(s->builtin) {
95474a4d8c2SCharles.Forsyth 		(*s->builtin)(res, n->right);
95574a4d8c2SCharles.Forsyth 		return;
95674a4d8c2SCharles.Forsyth 	}
95774a4d8c2SCharles.Forsyth 	if(s->proc == 0)
95874a4d8c2SCharles.Forsyth 		error("no function %s", s->name);
95974a4d8c2SCharles.Forsyth 
96074a4d8c2SCharles.Forsyth 	rsav = ret;
96174a4d8c2SCharles.Forsyth 	call(s->name, n->right, s->proc->left, s->proc->right, res);
96274a4d8c2SCharles.Forsyth 	ret = rsav;
96374a4d8c2SCharles.Forsyth }
96474a4d8c2SCharles.Forsyth 
96574a4d8c2SCharles.Forsyth void
ofmt(Node * n,Node * res)96674a4d8c2SCharles.Forsyth ofmt(Node *n, Node *res)
96774a4d8c2SCharles.Forsyth {
96874a4d8c2SCharles.Forsyth 	expr(n->left, res);
96974a4d8c2SCharles.Forsyth 	res->nstore.fmt = n->right->nstore.u0.sival;
97074a4d8c2SCharles.Forsyth }
97174a4d8c2SCharles.Forsyth 
97274a4d8c2SCharles.Forsyth void
owhat(Node * n,Node * res)97374a4d8c2SCharles.Forsyth owhat(Node *n, Node *res)
97474a4d8c2SCharles.Forsyth {
97574a4d8c2SCharles.Forsyth 	res->op = OCONST;		/* Default return value */
97674a4d8c2SCharles.Forsyth 	res->type = TLIST;
97774a4d8c2SCharles.Forsyth 	res->nstore.u0.sl = 0;
97874a4d8c2SCharles.Forsyth 	whatis(n->sym);
97974a4d8c2SCharles.Forsyth }
98074a4d8c2SCharles.Forsyth 
98174a4d8c2SCharles.Forsyth void (*expop[])(Node*, Node*) =
98274a4d8c2SCharles.Forsyth {
98374a4d8c2SCharles.Forsyth 	oname,		/* [ONAME]		oname, */
98474a4d8c2SCharles.Forsyth 	oconst,		/* [OCONST]		oconst, */
98574a4d8c2SCharles.Forsyth 	omul,		/* [OMUL]		omul, */
98674a4d8c2SCharles.Forsyth 	odiv,		/* [ODIV]		odiv, */
98774a4d8c2SCharles.Forsyth 	omod,		/* [OMOD]		omod, */
98874a4d8c2SCharles.Forsyth 	oadd,		/* [OADD]		oadd, */
98974a4d8c2SCharles.Forsyth 	osub,		/* [OSUB]		osub, */
99074a4d8c2SCharles.Forsyth 	orsh,		/* [ORSH]		orsh, */
99174a4d8c2SCharles.Forsyth 	olsh,		/* [OLSH]		olsh, */
99274a4d8c2SCharles.Forsyth 	olt,		/* [OLT]		olt, */
99374a4d8c2SCharles.Forsyth 	ogt,		/* [OGT]		ogt, */
99474a4d8c2SCharles.Forsyth 	oleq,		/* [OLEQ]		oleq, */
99574a4d8c2SCharles.Forsyth 	ogeq,		/* [OGEQ]		ogeq, */
99674a4d8c2SCharles.Forsyth 	oeq,		/* [OEQ]		oeq, */
99774a4d8c2SCharles.Forsyth 	oeq,		/* [ONEQ]		oeq, */
99874a4d8c2SCharles.Forsyth 	oland,		/* [OLAND]		oland, */
99974a4d8c2SCharles.Forsyth 	oxor,		/* [OXOR]		oxor, */
100074a4d8c2SCharles.Forsyth 	olor,		/* [OLOR]		olor, */
100174a4d8c2SCharles.Forsyth 	ocand,		/* [OCAND]		ocand, */
100274a4d8c2SCharles.Forsyth 	ocor,		/* [OCOR]		ocor, */
100374a4d8c2SCharles.Forsyth 	oasgn,		/* [OASGN]		oasgn, */
100474a4d8c2SCharles.Forsyth 	oindm,		/* [OINDM]		oindm, */
100574a4d8c2SCharles.Forsyth 	oeinc,		/* [OEDEC]		oeinc, */
100674a4d8c2SCharles.Forsyth 	oeinc,		/* [OEINC]		oeinc, */
100774a4d8c2SCharles.Forsyth 	opinc,		/* [OPINC]		opinc, */
100874a4d8c2SCharles.Forsyth 	opinc,		/* [OPDEC]		opinc, */
100974a4d8c2SCharles.Forsyth 	onot,		/* [ONOT]		onot, */
101074a4d8c2SCharles.Forsyth 	0,		/* [OIF]		0, */
101174a4d8c2SCharles.Forsyth 	0,		/* [ODO]		0, */
101274a4d8c2SCharles.Forsyth 	olist,		/* [OLIST]		olist, */
101374a4d8c2SCharles.Forsyth 	ocall,		/* [OCALL]		ocall, */
101474a4d8c2SCharles.Forsyth 	octruct,	/* [OCTRUCT]		octruct, */
101574a4d8c2SCharles.Forsyth 	0,		/* [OWHILE]		0, */
101674a4d8c2SCharles.Forsyth 	0,		/* [OELSE]		0, */
101774a4d8c2SCharles.Forsyth 	ohead,		/* [OHEAD]		ohead, */
101874a4d8c2SCharles.Forsyth 	otail,		/* [OTAIL]		otail, */
101974a4d8c2SCharles.Forsyth 	oappend,	/* [OAPPEND]		oappend, */
102074a4d8c2SCharles.Forsyth 	0,		/* [ORET]		0, */
102174a4d8c2SCharles.Forsyth 	oindex,		/* [OINDEX]		oindex, */
102274a4d8c2SCharles.Forsyth 	oindc,		/* [OINDC]		oindc, */
102374a4d8c2SCharles.Forsyth 	odot,		/* [ODOT]		odot, */
102474a4d8c2SCharles.Forsyth 	0,		/* [OLOCAL]		0, */
102574a4d8c2SCharles.Forsyth 	oframe,		/* [OFRAME]		oframe, */
102674a4d8c2SCharles.Forsyth 	0,		/* [OCOMPLEX]		0, */
102774a4d8c2SCharles.Forsyth 	odelete,	/* [ODELETE]		odelete, */
102874a4d8c2SCharles.Forsyth 	ocast,		/* [OCAST]		ocast, */
102974a4d8c2SCharles.Forsyth 	ofmt,		/* [OFMT]		ofmt, */
103074a4d8c2SCharles.Forsyth 	oeval,		/* [OEVAL]		oeval, */
103174a4d8c2SCharles.Forsyth 	owhat,		/* [OWHAT]		owhat, */
103274a4d8c2SCharles.Forsyth };
1033