xref: /csrg-svn/usr.bin/window/parser3.c (revision 33514)
118753Sedward /*
2*33514Sbostic  * Copyright (c) 1983 Regents of the University of California.
3*33514Sbostic  * All rights reserved.
4*33514Sbostic  *
5*33514Sbostic  * Redistribution and use in source and binary forms are permitted
6*33514Sbostic  * provided that this notice is preserved and that due credit is given
7*33514Sbostic  * to the University of California at Berkeley. The name of the University
8*33514Sbostic  * may not be used to endorse or promote products derived from this
9*33514Sbostic  * software without specific prior written permission. This software
10*33514Sbostic  * is provided ``as is'' without express or implied warranty.
1118753Sedward  */
1218753Sedward 
13*33514Sbostic #ifndef lint
14*33514Sbostic static char sccsid[] = "@(#)parser3.c	3.6 (Berkeley) 02/21/88";
15*33514Sbostic #endif /* not lint */
16*33514Sbostic 
1715851Sedward #include "parser.h"
1815851Sedward 
1915851Sedward /*
2015851Sedward  * =
2115851Sedward  * ? :
2215851Sedward  * ||
2315851Sedward  * &&
2415851Sedward  * |
2515851Sedward  * ^
2615851Sedward  * &
2715851Sedward  * == !=
2815851Sedward  * <= >=
2915851Sedward  * << >>
3015851Sedward  * + -
3115851Sedward  * * / %
3215851Sedward  * unary - + ~ !
3315851Sedward  */
3415851Sedward p_expr(v, flag)
3515851Sedward register struct value *v;
3615851Sedward char flag;
3715851Sedward {
3815851Sedward 	struct value t;
3915851Sedward 	int ret;
4015851Sedward 
4115851Sedward 	if (p_expr0(&t, flag) < 0)
4215851Sedward 		return -1;
4315851Sedward 
4415851Sedward 	if (token != T_ASSIGN) {
4515851Sedward 		*v = t;
4615851Sedward 		return 0;
4715851Sedward 	}
4815851Sedward 	switch (t.v_type) {
4916449Sedward 	case V_NUM:
5016449Sedward 		p_error("%d: Not a variable.", t.v_num);
5115851Sedward 	case V_ERR:
5215851Sedward 		t.v_str = 0;
5315851Sedward 		break;
5415851Sedward 	}
5515851Sedward 	ret = p_assign(t.v_str, v, flag);
5615851Sedward 	if (t.v_str != 0)
5715851Sedward 		str_free(t.v_str);
5815851Sedward 	return ret;
5915851Sedward }
6015851Sedward 
6115851Sedward /*
6215851Sedward  * ? :
6315851Sedward  */
6415851Sedward p_expr0(v, flag)
6515851Sedward register struct value *v;
6615851Sedward char flag;
6715851Sedward {
6815851Sedward 	struct value t;
6915851Sedward 	char true;
7015851Sedward 
7115851Sedward 	if (p_expr1(v, flag) < 0)
7215851Sedward 		return -1;
7315851Sedward 	if (token != T_QUEST)
7415851Sedward 		return 0;
7515851Sedward 	switch (v->v_type) {
7615851Sedward 	case V_NUM:
7715851Sedward 		true = v->v_num != 0;
7815851Sedward 		break;
7915851Sedward 	case V_STR:
8016713Sedward 		p_error("?: Numeric left operand required.");
8115851Sedward 		str_free(v->v_str);
8215851Sedward 		v->v_type = V_ERR;
8315851Sedward 	case V_ERR:
8415851Sedward 		flag = 0;
8515851Sedward 		break;
8615851Sedward 	}
8715851Sedward 	(void) s_gettok();
8815851Sedward 	v->v_type = V_ERR;
8915851Sedward 	if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0)
9015851Sedward 		return -1;
9115851Sedward 	if (token != T_COLON) {
9215851Sedward 		val_free(*v);
9315851Sedward 		p_synerror();
9415851Sedward 		return -1;
9515851Sedward 	}
9615851Sedward 	(void) s_gettok();
9715851Sedward 	return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0);
9815851Sedward }
9915851Sedward 
10015851Sedward /*
10115851Sedward  * ||
10215851Sedward  */
10315851Sedward p_expr1(v, flag)
10415851Sedward register struct value *v;
10515851Sedward char flag;
10615851Sedward {
10715851Sedward 	char true = 0;
10815851Sedward 
10915851Sedward 	if (p_expr2(v, flag) < 0)
11015851Sedward 		return -1;
11115851Sedward 	if (token != T_OROR)
11215851Sedward 		return 0;
11315851Sedward 	for (;;) {
11415851Sedward 		switch (v->v_type) {
11515851Sedward 		case V_NUM:
11615851Sedward 			v->v_num = true = true || v->v_num != 0;
11715851Sedward 			break;
11815851Sedward 		case V_STR:
11916713Sedward 			p_error("||: Numeric operands required.");
12015851Sedward 			str_free(v->v_str);
12115851Sedward 			v->v_type = V_ERR;
12215851Sedward 		case V_ERR:
12315851Sedward 			flag = 0;
12415851Sedward 			break;
12515851Sedward 		}
12615851Sedward 		if (token != T_OROR)
12715851Sedward 			return 0;
12815851Sedward 		(void) s_gettok();
12915851Sedward 		if (p_expr2(v, flag && !true) < 0)
13015851Sedward 			return -1;
13115851Sedward 	}
13215851Sedward }
13315851Sedward 
13415851Sedward /*
13515851Sedward  * &&
13615851Sedward  */
13715851Sedward p_expr2(v, flag)
13815851Sedward register struct value *v;
13915851Sedward char flag;
14015851Sedward {
14115851Sedward 	char true = 1;
14215851Sedward 
14315851Sedward 	if (p_expr3_10(3, v, flag) < 0)
14415851Sedward 		return -1;
14515851Sedward 	if (token != T_ANDAND)
14615851Sedward 		return 0;
14715851Sedward 	for (;;) {
14815851Sedward 		switch (v->v_type) {
14915851Sedward 		case V_NUM:
15015851Sedward 			v->v_num = true = true && v->v_num != 0;
15115851Sedward 			break;
15215851Sedward 		case V_STR:
15316713Sedward 			p_error("&&: Numeric operands required.");
15415851Sedward 			str_free(v->v_str);
15515851Sedward 			v->v_type = V_ERR;
15615851Sedward 		case V_ERR:
15715851Sedward 			flag = 0;
15815851Sedward 			break;
15915851Sedward 		}
16015851Sedward 		if (token != T_ANDAND)
16115851Sedward 			return 0;
16215851Sedward 		(void) s_gettok();
16315851Sedward 		if (p_expr3_10(3, v, flag && true) < 0)
16415851Sedward 			return -1;
16515851Sedward 	}
16615851Sedward 	/*NOTREACHED*/
16715851Sedward }
168