we have to initialize escapec before processing arguments
[unix-history] / usr / src / usr.bin / window / parser3.c
CommitLineData
6c6eaf9a 1#ifndef lint
fbbe9777 2static char sccsid[] = "@(#)parser3.c 3.4 %G%";
6c6eaf9a
EW
3#endif
4
5#include "parser.h"
6
7/*
8 * =
9 * ? :
10 * ||
11 * &&
12 * |
13 * ^
14 * &
15 * == !=
16 * <= >=
17 * << >>
18 * + -
19 * * / %
20 * unary - + ~ !
21 */
22p_expr(v, flag)
23register struct value *v;
24char flag;
25{
26 struct value t;
27 int ret;
28
6c6eaf9a
EW
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) {
bb4a0c0b
EW
37 case V_NUM:
38 p_error("%d: Not a variable.", t.v_num);
6c6eaf9a
EW
39 case V_ERR:
40 t.v_str = 0;
41 break;
6c6eaf9a
EW
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 */
52p_expr0(v, flag)
53register struct value *v;
54char 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:
fbbe9777 68 p_error("?: Numeric left operand required.");
6c6eaf9a
EW
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 */
91p_expr1(v, flag)
92register struct value *v;
93char 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:
fbbe9777 107 p_error("||: Numeric operands required.");
6c6eaf9a
EW
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 */
125p_expr2(v, flag)
126register struct value *v;
127char 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:
fbbe9777 141 p_error("&&: Numeric operands required.");
6c6eaf9a
EW
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}