xref: /csrg-svn/usr.bin/window/parser3.c (revision 16713)
115851Sedward #ifndef lint
2*16713Sedward static char sccsid[] = "@(#)parser3.c	3.4 07/13/84";
315851Sedward #endif
415851Sedward 
515851Sedward #include "parser.h"
615851Sedward 
715851Sedward /*
815851Sedward  * =
915851Sedward  * ? :
1015851Sedward  * ||
1115851Sedward  * &&
1215851Sedward  * |
1315851Sedward  * ^
1415851Sedward  * &
1515851Sedward  * == !=
1615851Sedward  * <= >=
1715851Sedward  * << >>
1815851Sedward  * + -
1915851Sedward  * * / %
2015851Sedward  * unary - + ~ !
2115851Sedward  */
2215851Sedward p_expr(v, flag)
2315851Sedward register struct value *v;
2415851Sedward char flag;
2515851Sedward {
2615851Sedward 	struct value t;
2715851Sedward 	int ret;
2815851Sedward 
2915851Sedward 	if (p_expr0(&t, flag) < 0)
3015851Sedward 		return -1;
3115851Sedward 
3215851Sedward 	if (token != T_ASSIGN) {
3315851Sedward 		*v = t;
3415851Sedward 		return 0;
3515851Sedward 	}
3615851Sedward 	switch (t.v_type) {
3716449Sedward 	case V_NUM:
3816449Sedward 		p_error("%d: Not a variable.", t.v_num);
3915851Sedward 	case V_ERR:
4015851Sedward 		t.v_str = 0;
4115851Sedward 		break;
4215851Sedward 	}
4315851Sedward 	ret = p_assign(t.v_str, v, flag);
4415851Sedward 	if (t.v_str != 0)
4515851Sedward 		str_free(t.v_str);
4615851Sedward 	return ret;
4715851Sedward }
4815851Sedward 
4915851Sedward /*
5015851Sedward  * ? :
5115851Sedward  */
5215851Sedward p_expr0(v, flag)
5315851Sedward register struct value *v;
5415851Sedward char flag;
5515851Sedward {
5615851Sedward 	struct value t;
5715851Sedward 	char true;
5815851Sedward 
5915851Sedward 	if (p_expr1(v, flag) < 0)
6015851Sedward 		return -1;
6115851Sedward 	if (token != T_QUEST)
6215851Sedward 		return 0;
6315851Sedward 	switch (v->v_type) {
6415851Sedward 	case V_NUM:
6515851Sedward 		true = v->v_num != 0;
6615851Sedward 		break;
6715851Sedward 	case V_STR:
68*16713Sedward 		p_error("?: Numeric left operand required.");
6915851Sedward 		str_free(v->v_str);
7015851Sedward 		v->v_type = V_ERR;
7115851Sedward 	case V_ERR:
7215851Sedward 		flag = 0;
7315851Sedward 		break;
7415851Sedward 	}
7515851Sedward 	(void) s_gettok();
7615851Sedward 	v->v_type = V_ERR;
7715851Sedward 	if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0)
7815851Sedward 		return -1;
7915851Sedward 	if (token != T_COLON) {
8015851Sedward 		val_free(*v);
8115851Sedward 		p_synerror();
8215851Sedward 		return -1;
8315851Sedward 	}
8415851Sedward 	(void) s_gettok();
8515851Sedward 	return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0);
8615851Sedward }
8715851Sedward 
8815851Sedward /*
8915851Sedward  * ||
9015851Sedward  */
9115851Sedward p_expr1(v, flag)
9215851Sedward register struct value *v;
9315851Sedward char flag;
9415851Sedward {
9515851Sedward 	char true = 0;
9615851Sedward 
9715851Sedward 	if (p_expr2(v, flag) < 0)
9815851Sedward 		return -1;
9915851Sedward 	if (token != T_OROR)
10015851Sedward 		return 0;
10115851Sedward 	for (;;) {
10215851Sedward 		switch (v->v_type) {
10315851Sedward 		case V_NUM:
10415851Sedward 			v->v_num = true = true || v->v_num != 0;
10515851Sedward 			break;
10615851Sedward 		case V_STR:
107*16713Sedward 			p_error("||: Numeric operands required.");
10815851Sedward 			str_free(v->v_str);
10915851Sedward 			v->v_type = V_ERR;
11015851Sedward 		case V_ERR:
11115851Sedward 			flag = 0;
11215851Sedward 			break;
11315851Sedward 		}
11415851Sedward 		if (token != T_OROR)
11515851Sedward 			return 0;
11615851Sedward 		(void) s_gettok();
11715851Sedward 		if (p_expr2(v, flag && !true) < 0)
11815851Sedward 			return -1;
11915851Sedward 	}
12015851Sedward }
12115851Sedward 
12215851Sedward /*
12315851Sedward  * &&
12415851Sedward  */
12515851Sedward p_expr2(v, flag)
12615851Sedward register struct value *v;
12715851Sedward char flag;
12815851Sedward {
12915851Sedward 	char true = 1;
13015851Sedward 
13115851Sedward 	if (p_expr3_10(3, v, flag) < 0)
13215851Sedward 		return -1;
13315851Sedward 	if (token != T_ANDAND)
13415851Sedward 		return 0;
13515851Sedward 	for (;;) {
13615851Sedward 		switch (v->v_type) {
13715851Sedward 		case V_NUM:
13815851Sedward 			v->v_num = true = true && v->v_num != 0;
13915851Sedward 			break;
14015851Sedward 		case V_STR:
141*16713Sedward 			p_error("&&: Numeric operands required.");
14215851Sedward 			str_free(v->v_str);
14315851Sedward 			v->v_type = V_ERR;
14415851Sedward 		case V_ERR:
14515851Sedward 			flag = 0;
14615851Sedward 			break;
14715851Sedward 		}
14815851Sedward 		if (token != T_ANDAND)
14915851Sedward 			return 0;
15015851Sedward 		(void) s_gettok();
15115851Sedward 		if (p_expr3_10(3, v, flag && true) < 0)
15215851Sedward 			return -1;
15315851Sedward 	}
15415851Sedward 	/*NOTREACHED*/
15515851Sedward }
156