gratuitous stylistic change
[unix-history] / usr / src / usr.bin / window / parser3.c
CommitLineData
60de5df9 1/*
46e9ea25
KB
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
5e8b0e60
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
60de5df9
EW
16 */
17
46e9ea25 18#ifndef lint
5e8b0e60 19static char sccsid[] = "@(#)parser3.c 3.7 (Berkeley) %G%";
46e9ea25
KB
20#endif /* not lint */
21
6c6eaf9a
EW
22#include "parser.h"
23
24/*
25 * =
26 * ? :
27 * ||
28 * &&
29 * |
30 * ^
31 * &
32 * == !=
33 * <= >=
34 * << >>
35 * + -
36 * * / %
37 * unary - + ~ !
38 */
39p_expr(v, flag)
40register struct value *v;
41char flag;
42{
43 struct value t;
44 int ret;
45
6c6eaf9a
EW
46 if (p_expr0(&t, flag) < 0)
47 return -1;
48
49 if (token != T_ASSIGN) {
50 *v = t;
51 return 0;
52 }
53 switch (t.v_type) {
bb4a0c0b
EW
54 case V_NUM:
55 p_error("%d: Not a variable.", t.v_num);
6c6eaf9a
EW
56 case V_ERR:
57 t.v_str = 0;
58 break;
6c6eaf9a
EW
59 }
60 ret = p_assign(t.v_str, v, flag);
61 if (t.v_str != 0)
62 str_free(t.v_str);
63 return ret;
64}
65
66/*
67 * ? :
68 */
69p_expr0(v, flag)
70register struct value *v;
71char flag;
72{
73 struct value t;
74 char true;
75
76 if (p_expr1(v, flag) < 0)
77 return -1;
78 if (token != T_QUEST)
79 return 0;
80 switch (v->v_type) {
81 case V_NUM:
82 true = v->v_num != 0;
83 break;
84 case V_STR:
fbbe9777 85 p_error("?: Numeric left operand required.");
6c6eaf9a
EW
86 str_free(v->v_str);
87 v->v_type = V_ERR;
88 case V_ERR:
89 flag = 0;
90 break;
91 }
92 (void) s_gettok();
93 v->v_type = V_ERR;
94 if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0)
95 return -1;
96 if (token != T_COLON) {
97 val_free(*v);
98 p_synerror();
99 return -1;
100 }
101 (void) s_gettok();
102 return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0);
103}
104
105/*
106 * ||
107 */
108p_expr1(v, flag)
109register struct value *v;
110char flag;
111{
112 char true = 0;
113
114 if (p_expr2(v, flag) < 0)
115 return -1;
116 if (token != T_OROR)
117 return 0;
118 for (;;) {
119 switch (v->v_type) {
120 case V_NUM:
121 v->v_num = true = true || v->v_num != 0;
122 break;
123 case V_STR:
fbbe9777 124 p_error("||: Numeric operands required.");
6c6eaf9a
EW
125 str_free(v->v_str);
126 v->v_type = V_ERR;
127 case V_ERR:
128 flag = 0;
129 break;
130 }
131 if (token != T_OROR)
132 return 0;
133 (void) s_gettok();
134 if (p_expr2(v, flag && !true) < 0)
135 return -1;
136 }
137}
138
139/*
140 * &&
141 */
142p_expr2(v, flag)
143register struct value *v;
144char flag;
145{
146 char true = 1;
147
148 if (p_expr3_10(3, v, flag) < 0)
149 return -1;
150 if (token != T_ANDAND)
151 return 0;
152 for (;;) {
153 switch (v->v_type) {
154 case V_NUM:
155 v->v_num = true = true && v->v_num != 0;
156 break;
157 case V_STR:
fbbe9777 158 p_error("&&: Numeric operands required.");
6c6eaf9a
EW
159 str_free(v->v_str);
160 v->v_type = V_ERR;
161 case V_ERR:
162 flag = 0;
163 break;
164 }
165 if (token != T_ANDAND)
166 return 0;
167 (void) s_gettok();
168 if (p_expr3_10(3, v, flag && true) < 0)
169 return -1;
170 }
171 /*NOTREACHED*/
172}