xref: /csrg-svn/usr.bin/window/parser3.c (revision 15851)
1*15851Sedward #ifndef lint
2*15851Sedward static	char *sccsid = "@(#)parser3.c	3.1 84/01/12";
3*15851Sedward #endif
4*15851Sedward 
5*15851Sedward #include "parser.h"
6*15851Sedward 
7*15851Sedward /*
8*15851Sedward  * =
9*15851Sedward  * ? :
10*15851Sedward  * ||
11*15851Sedward  * &&
12*15851Sedward  * |
13*15851Sedward  * ^
14*15851Sedward  * &
15*15851Sedward  * == !=
16*15851Sedward  * <= >=
17*15851Sedward  * << >>
18*15851Sedward  * + -
19*15851Sedward  * * / %
20*15851Sedward  * unary - + ~ !
21*15851Sedward  */
22*15851Sedward p_expr(v, flag)
23*15851Sedward register struct value *v;
24*15851Sedward char flag;
25*15851Sedward {
26*15851Sedward 	struct value t;
27*15851Sedward 	int ret;
28*15851Sedward 
29*15851Sedward #ifdef DEBUG
30*15851Sedward 	error("expr: %d.", flag);
31*15851Sedward #endif
32*15851Sedward 	if (p_expr0(&t, flag) < 0)
33*15851Sedward 		return -1;
34*15851Sedward 
35*15851Sedward 	if (token != T_ASSIGN) {
36*15851Sedward 		*v = t;
37*15851Sedward 		return 0;
38*15851Sedward 	}
39*15851Sedward 	switch (t.v_type) {
40*15851Sedward 	case V_ERR:
41*15851Sedward 		t.v_str = 0;
42*15851Sedward 		break;
43*15851Sedward 	case V_NUM:
44*15851Sedward 		if ((t.v_str = str_itoa(t.v_num)) == 0) {
45*15851Sedward 			p_memerror();
46*15851Sedward 			return -1;
47*15851Sedward 		}
48*15851Sedward 	}
49*15851Sedward 	ret = p_assign(t.v_str, v, flag);
50*15851Sedward 	if (t.v_str != 0)
51*15851Sedward 		str_free(t.v_str);
52*15851Sedward 	return ret;
53*15851Sedward }
54*15851Sedward 
55*15851Sedward /*
56*15851Sedward  * ? :
57*15851Sedward  */
58*15851Sedward p_expr0(v, flag)
59*15851Sedward register struct value *v;
60*15851Sedward char flag;
61*15851Sedward {
62*15851Sedward 	struct value t;
63*15851Sedward 	char true;
64*15851Sedward 
65*15851Sedward 	if (p_expr1(v, flag) < 0)
66*15851Sedward 		return -1;
67*15851Sedward 	if (token != T_QUEST)
68*15851Sedward 		return 0;
69*15851Sedward 	switch (v->v_type) {
70*15851Sedward 	case V_NUM:
71*15851Sedward 		true = v->v_num != 0;
72*15851Sedward 		break;
73*15851Sedward 	case V_STR:
74*15851Sedward 		p_error("Numeric value required for ?.");
75*15851Sedward 		str_free(v->v_str);
76*15851Sedward 		v->v_type = V_ERR;
77*15851Sedward 	case V_ERR:
78*15851Sedward 		flag = 0;
79*15851Sedward 		break;
80*15851Sedward 	}
81*15851Sedward 	(void) s_gettok();
82*15851Sedward 	v->v_type = V_ERR;
83*15851Sedward 	if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0)
84*15851Sedward 		return -1;
85*15851Sedward 	if (token != T_COLON) {
86*15851Sedward 		val_free(*v);
87*15851Sedward 		p_synerror();
88*15851Sedward 		return -1;
89*15851Sedward 	}
90*15851Sedward 	(void) s_gettok();
91*15851Sedward 	return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0);
92*15851Sedward }
93*15851Sedward 
94*15851Sedward /*
95*15851Sedward  * ||
96*15851Sedward  */
97*15851Sedward p_expr1(v, flag)
98*15851Sedward register struct value *v;
99*15851Sedward char flag;
100*15851Sedward {
101*15851Sedward 	char true = 0;
102*15851Sedward 
103*15851Sedward 	if (p_expr2(v, flag) < 0)
104*15851Sedward 		return -1;
105*15851Sedward 	if (token != T_OROR)
106*15851Sedward 		return 0;
107*15851Sedward 	for (;;) {
108*15851Sedward 		switch (v->v_type) {
109*15851Sedward 		case V_NUM:
110*15851Sedward 			v->v_num = true = true || v->v_num != 0;
111*15851Sedward 			break;
112*15851Sedward 		case V_STR:
113*15851Sedward 			p_error("Numeric value required for ||.");
114*15851Sedward 			str_free(v->v_str);
115*15851Sedward 			v->v_type = V_ERR;
116*15851Sedward 		case V_ERR:
117*15851Sedward 			flag = 0;
118*15851Sedward 			break;
119*15851Sedward 		}
120*15851Sedward 		if (token != T_OROR)
121*15851Sedward 			return 0;
122*15851Sedward 		(void) s_gettok();
123*15851Sedward 		if (p_expr2(v, flag && !true) < 0)
124*15851Sedward 			return -1;
125*15851Sedward 	}
126*15851Sedward }
127*15851Sedward 
128*15851Sedward /*
129*15851Sedward  * &&
130*15851Sedward  */
131*15851Sedward p_expr2(v, flag)
132*15851Sedward register struct value *v;
133*15851Sedward char flag;
134*15851Sedward {
135*15851Sedward 	char true = 1;
136*15851Sedward 
137*15851Sedward 	if (p_expr3_10(3, v, flag) < 0)
138*15851Sedward 		return -1;
139*15851Sedward 	if (token != T_ANDAND)
140*15851Sedward 		return 0;
141*15851Sedward 	for (;;) {
142*15851Sedward 		switch (v->v_type) {
143*15851Sedward 		case V_NUM:
144*15851Sedward 			v->v_num = true = true && v->v_num != 0;
145*15851Sedward 			break;
146*15851Sedward 		case V_STR:
147*15851Sedward 			p_error("Numeric value required for &&.");
148*15851Sedward 			str_free(v->v_str);
149*15851Sedward 			v->v_type = V_ERR;
150*15851Sedward 		case V_ERR:
151*15851Sedward 			flag = 0;
152*15851Sedward 			break;
153*15851Sedward 		}
154*15851Sedward 		if (token != T_ANDAND)
155*15851Sedward 			return 0;
156*15851Sedward 		(void) s_gettok();
157*15851Sedward 		if (p_expr3_10(3, v, flag && true) < 0)
158*15851Sedward 			return -1;
159*15851Sedward 	}
160*15851Sedward 	/*NOTREACHED*/
161*15851Sedward }
162