|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Edward Wang at The University of California, Berkeley. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted provided ! 9: * that: (1) source distributions retain this entire copyright notice and ! 10: * comment, and (2) distributions including binaries display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * University of California, Berkeley and its contributors'' in the ! 13: * documentation or other materials provided with the distribution and in ! 14: * all advertising materials mentioning features or use of this software. ! 15: * Neither the name of the University nor the names of its contributors may ! 16: * be used to endorse or promote products derived from this software without ! 17: * specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)parser3.c 3.9 (Berkeley) 6/6/90"; ! 25: #endif /* not lint */ ! 26: ! 27: #include "parser.h" ! 28: ! 29: /* ! 30: * = ! 31: * ? : ! 32: * || ! 33: * && ! 34: * | ! 35: * ^ ! 36: * & ! 37: * == != ! 38: * <= >= ! 39: * << >> ! 40: * + - ! 41: * * / % ! 42: * unary - + ~ ! ! 43: */ ! 44: p_expr(v, flag) ! 45: register struct value *v; ! 46: char flag; ! 47: { ! 48: struct value t; ! 49: int ret; ! 50: ! 51: if (p_expr0(&t, flag) < 0) ! 52: return -1; ! 53: ! 54: if (token != T_ASSIGN) { ! 55: *v = t; ! 56: return 0; ! 57: } ! 58: switch (t.v_type) { ! 59: case V_NUM: ! 60: p_error("%d: Not a variable.", t.v_num); ! 61: case V_ERR: ! 62: t.v_str = 0; ! 63: break; ! 64: } ! 65: ret = p_assign(t.v_str, v, flag); ! 66: if (t.v_str != 0) ! 67: str_free(t.v_str); ! 68: return ret; ! 69: } ! 70: ! 71: /* ! 72: * ? : ! 73: */ ! 74: p_expr0(v, flag) ! 75: register struct value *v; ! 76: char flag; ! 77: { ! 78: struct value t; ! 79: char true; ! 80: ! 81: if (p_expr1(v, flag) < 0) ! 82: return -1; ! 83: if (token != T_QUEST) ! 84: return 0; ! 85: switch (v->v_type) { ! 86: case V_NUM: ! 87: true = v->v_num != 0; ! 88: break; ! 89: case V_STR: ! 90: p_error("?: Numeric left operand required."); ! 91: str_free(v->v_str); ! 92: v->v_type = V_ERR; ! 93: case V_ERR: ! 94: flag = 0; ! 95: break; ! 96: } ! 97: (void) s_gettok(); ! 98: v->v_type = V_ERR; ! 99: if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0) ! 100: return -1; ! 101: if (token != T_COLON) { ! 102: val_free(*v); ! 103: p_synerror(); ! 104: return -1; ! 105: } ! 106: (void) s_gettok(); ! 107: return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0); ! 108: } ! 109: ! 110: /* ! 111: * || ! 112: */ ! 113: p_expr1(v, flag) ! 114: register struct value *v; ! 115: char flag; ! 116: { ! 117: char true = 0; ! 118: ! 119: if (p_expr2(v, flag) < 0) ! 120: return -1; ! 121: if (token != T_OROR) ! 122: return 0; ! 123: for (;;) { ! 124: switch (v->v_type) { ! 125: case V_NUM: ! 126: v->v_num = true = true || v->v_num != 0; ! 127: break; ! 128: case V_STR: ! 129: p_error("||: Numeric operands required."); ! 130: str_free(v->v_str); ! 131: v->v_type = V_ERR; ! 132: case V_ERR: ! 133: flag = 0; ! 134: break; ! 135: } ! 136: if (token != T_OROR) ! 137: return 0; ! 138: (void) s_gettok(); ! 139: if (p_expr2(v, flag && !true) < 0) ! 140: return -1; ! 141: } ! 142: } ! 143: ! 144: /* ! 145: * && ! 146: */ ! 147: p_expr2(v, flag) ! 148: register struct value *v; ! 149: char flag; ! 150: { ! 151: char true = 1; ! 152: ! 153: if (p_expr3_10(3, v, flag) < 0) ! 154: return -1; ! 155: if (token != T_ANDAND) ! 156: return 0; ! 157: for (;;) { ! 158: switch (v->v_type) { ! 159: case V_NUM: ! 160: v->v_num = true = true && v->v_num != 0; ! 161: break; ! 162: case V_STR: ! 163: p_error("&&: Numeric operands required."); ! 164: str_free(v->v_str); ! 165: v->v_type = V_ERR; ! 166: case V_ERR: ! 167: flag = 0; ! 168: break; ! 169: } ! 170: if (token != T_ANDAND) ! 171: return 0; ! 172: (void) s_gettok(); ! 173: if (p_expr3_10(3, v, flag && true) < 0) ! 174: return -1; ! 175: } ! 176: /*NOTREACHED*/ ! 177: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.