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