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