xref: /csrg-svn/usr.bin/window/parser5.c (revision 16298)
115853Sedward #ifndef lint
2*16298Sedward static	char *sccsid = "@(#)parser5.c	3.3 84/04/06";
315853Sedward #endif
415853Sedward 
515853Sedward #include "parser.h"
615864Sedward #include "var.h"
715853Sedward 
815853Sedward /*
915853Sedward  * unary $ + - ! ~
1015853Sedward  */
1115853Sedward p_expr11(v, flag)
1215853Sedward register struct value *v;
1315853Sedward char flag;
1415853Sedward {
1515853Sedward 	int op;
1615853Sedward 	char *opname;
1715853Sedward 
1815853Sedward 	switch (token) {
1915853Sedward 	case T_DOLLAR:
2015853Sedward 		opname = "$";
2115853Sedward 		break;
2215853Sedward 	case T_PLUS:
2315853Sedward 		opname = "unary +";
2415853Sedward 		break;
2515853Sedward 	case T_MINUS:
2615853Sedward 		opname = "unary -";
2715853Sedward 		break;
2815853Sedward 	case T_NOT:
2915853Sedward 		opname = "!";
3015853Sedward 		break;
3115853Sedward 	case T_COMP:
3215853Sedward 		opname = "~";
3315853Sedward 		break;
3415853Sedward 	default:
3515853Sedward 		return p_expr12(v, flag);
3615853Sedward 	}
3715853Sedward 	op = token;
3815853Sedward 	(void) s_gettok();
3915853Sedward 	if (p_expr11(v, flag) < 0)
4015853Sedward 		return -1;
4115853Sedward 	switch (v->v_type) {
4215853Sedward 	case V_NUM:
4315853Sedward 		if (op == T_DOLLAR && (v->v_str = str_itoa(v->v_num)) == 0) {
4415853Sedward 			p_memerror();
4515853Sedward 			return -1;
4615853Sedward 		}
4715853Sedward 		break;
4815853Sedward 	case V_STR:
4915853Sedward 		switch (op) {
5015853Sedward 		case T_MINUS:
5115853Sedward 		case T_NOT:
5215853Sedward 		case T_COMP:
5315853Sedward 			p_error("Numeric value required for %s.", opname);
5415853Sedward 			str_free(v->v_str);
5515853Sedward 			v->v_type = V_ERR;
5615853Sedward 			return 0;
5715853Sedward 		}
5815853Sedward 		break;
5915853Sedward 	case V_ERR:
6015853Sedward 		return 0;
6115853Sedward 	}
6215853Sedward 	switch (op) {
6315853Sedward 	case T_DOLLAR: {
6415853Sedward 		struct var *r;
6515853Sedward 		if ((r = var_lookup(v->v_str)) == 0) {
6615853Sedward 			p_error("%s: Undefined variable.", v->v_str);
6715853Sedward 			str_free(v->v_str);
6815853Sedward 			v->v_type = V_ERR;
6915853Sedward 			return 0;
7015853Sedward 		}
7115853Sedward 		str_free(v->v_str);
7215853Sedward 		if (flag) {
7315853Sedward 			*v = r->r_val;
7415853Sedward 			if (v->v_type == V_STR
7515853Sedward 			    && (v->v_str = str_cpy(v->v_str)) == 0) {
7615853Sedward 				p_memerror();
7715853Sedward 				return -1;
7815853Sedward 			}
7915853Sedward 		}
8015853Sedward 		break;
8115853Sedward 		}
8215853Sedward 	case T_MINUS:
8315853Sedward 		v->v_num = - v->v_num;
8415853Sedward 		break;
8515853Sedward 	case T_NOT:
8615853Sedward 		v->v_num = ! v->v_num;
8715853Sedward 		break;
8815853Sedward 	case T_COMP:
8915853Sedward 		v->v_num = ~ v->v_num;
9015853Sedward 		break;
9115853Sedward 	}
9215853Sedward 	return 0;
9315853Sedward }
9415853Sedward 
9515853Sedward /*
9615853Sedward  * string, number, ( expr )
9715853Sedward  * Plus function calls.
9815853Sedward  * Also we map % into string.
9915853Sedward  *
10015853Sedward  * Always return v_type == V_ERR when flag == 0.
10115853Sedward  */
10215853Sedward p_expr12(v, flag)
10315853Sedward register struct value *v;
10415853Sedward char flag;
10515853Sedward {
10615853Sedward 	v->v_type = V_ERR;
10715853Sedward #ifdef DEBUG
10815853Sedward 	error("expr12: %d.", flag);
10915853Sedward #endif
11015853Sedward 	switch (token) {
11115853Sedward 	case T_MOD:
11215853Sedward #ifdef DEBUG
11315853Sedward 		error("expr12: %.");
11415853Sedward #endif
11515853Sedward 		if (flag) {
11615853Sedward 			v->v_type = V_STR;
11715853Sedward 			v->v_str = str_cpy("%");
11815853Sedward 		}
11915853Sedward 		(void) s_gettok();
12015853Sedward 		break;
12115853Sedward 	case T_NUM:
12215853Sedward #ifdef DEBUG
12315853Sedward 		error("expr12: NUM %d.", token_num);
12415853Sedward #endif
12515853Sedward 		if (flag) {
12615853Sedward 			v->v_type = V_NUM;
12715853Sedward 			v->v_num = token_num;
12815853Sedward 		}
12915853Sedward 		(void) s_gettok();
13015853Sedward 		break;
13115853Sedward 	case T_STR:
13215853Sedward #ifdef DEBUG
13315853Sedward 		error("expr12: STR %s.", token_str);
13415853Sedward #endif
13515853Sedward 		if (flag) {
13615853Sedward 			v->v_type = V_STR;
13715853Sedward 			v->v_str = token_str;
13815853Sedward 		} else
13915853Sedward 			str_free(token_str);
14015853Sedward 		(void) s_gettok();
14115853Sedward 		break;
14215853Sedward 	case T_LP:
14315853Sedward 		(void) s_gettok();
14415853Sedward 		if (p_expr(v, flag) < 0) {
14515853Sedward 			p_synerror();
14615853Sedward 			return -1;
14715853Sedward 		}
14815853Sedward 		if (token != T_RP) {
14915853Sedward 			p_synerror();
15015853Sedward 			val_free(*v);
15115853Sedward 			return -1;
15215853Sedward 		}
15315853Sedward 		(void) s_gettok();
15415853Sedward 		break;
15515853Sedward 	default:
15615853Sedward #ifdef DEBUG
15715853Sedward 		error("expr12: token %d.", token);
15815853Sedward #endif
15915853Sedward 		return -1;
16015853Sedward 	}
16115853Sedward 	while (token == T_LP) {
16215853Sedward 		char *cmd;
16315853Sedward 
16415853Sedward 		(void) s_gettok();
16515853Sedward 		switch (v->v_type) {
16615853Sedward 		case V_STR:
16715853Sedward 			cmd = v->v_str;
16815853Sedward 			break;
16915853Sedward 		case V_ERR:
17015853Sedward 			flag = 0;
17115853Sedward 			cmd = 0;
17215853Sedward 			break;
17315853Sedward 		case V_NUM:
17415853Sedward 			if ((cmd = str_itoa(v->v_num)) == 0) {
17515853Sedward 				p_memerror();
17615853Sedward 				return -1;
17715853Sedward 			}
17815853Sedward 			break;
17915853Sedward 		}
18015853Sedward #ifdef DEBUG
18115853Sedward 		error("expr12: function %s.", cmd);
18215853Sedward #endif
18315853Sedward 		if (p_function(cmd, v, flag) < 0) {
184*16298Sedward 			if (cmd)
185*16298Sedward 				str_free(cmd);
18615853Sedward 			return -1;
18715853Sedward 		}
188*16298Sedward 		if (cmd)
189*16298Sedward 			str_free(cmd);
19015853Sedward 		if (token != T_RP) {
19115853Sedward 			p_synerror();
19215853Sedward 			val_free(*v);
19315853Sedward 			return -1;
19415853Sedward 		}
19515853Sedward 		(void) s_gettok();
19615853Sedward 	}
19715853Sedward 	return 0;
19815853Sedward }
199