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