Annotation of 43BSD/ucb/window/parser3.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)parser3.c  3.5 4/24/85";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Copyright (c) 1983 Regents of the University of California,
                      7:  * All rights reserved.  Redistribution permitted subject to
                      8:  * the terms of the Berkeley Software License Agreement.
                      9:  */
                     10: 
                     11: #include "parser.h"
                     12: 
                     13: /*
                     14:  * =
                     15:  * ? :
                     16:  * ||
                     17:  * &&
                     18:  * |
                     19:  * ^
                     20:  * &
                     21:  * == !=
                     22:  * <= >=
                     23:  * << >>
                     24:  * + -
                     25:  * * / %
                     26:  * unary - + ~ !
                     27:  */
                     28: p_expr(v, flag)
                     29: register struct value *v;
                     30: char flag;
                     31: {
                     32:        struct value t;
                     33:        int ret;
                     34: 
                     35:        if (p_expr0(&t, flag) < 0)
                     36:                return -1;
                     37: 
                     38:        if (token != T_ASSIGN) {
                     39:                *v = t;
                     40:                return 0;
                     41:        }
                     42:        switch (t.v_type) {
                     43:        case V_NUM:
                     44:                p_error("%d: Not a variable.", t.v_num);
                     45:        case V_ERR:
                     46:                t.v_str = 0;
                     47:                break;
                     48:        }
                     49:        ret = p_assign(t.v_str, v, flag);
                     50:        if (t.v_str != 0)
                     51:                str_free(t.v_str);
                     52:        return ret;
                     53: }
                     54: 
                     55: /*
                     56:  * ? :
                     57:  */
                     58: p_expr0(v, flag)
                     59: register struct value *v;
                     60: char flag;
                     61: {
                     62:        struct value t;
                     63:        char true;
                     64: 
                     65:        if (p_expr1(v, flag) < 0)
                     66:                return -1;
                     67:        if (token != T_QUEST)
                     68:                return 0;
                     69:        switch (v->v_type) {
                     70:        case V_NUM:
                     71:                true = v->v_num != 0;
                     72:                break;
                     73:        case V_STR:
                     74:                p_error("?: Numeric left operand required.");
                     75:                str_free(v->v_str);
                     76:                v->v_type = V_ERR;
                     77:        case V_ERR:
                     78:                flag = 0;
                     79:                break;
                     80:        }
                     81:        (void) s_gettok();
                     82:        v->v_type = V_ERR;
                     83:        if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0)
                     84:                return -1;
                     85:        if (token != T_COLON) {
                     86:                val_free(*v);
                     87:                p_synerror();
                     88:                return -1;
                     89:        }
                     90:        (void) s_gettok();
                     91:        return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0);
                     92: }
                     93: 
                     94: /*
                     95:  * ||
                     96:  */
                     97: p_expr1(v, flag)
                     98: register struct value *v;
                     99: char flag;
                    100: {
                    101:        char true = 0;
                    102: 
                    103:        if (p_expr2(v, flag) < 0)
                    104:                return -1;
                    105:        if (token != T_OROR)
                    106:                return 0;
                    107:        for (;;) {
                    108:                switch (v->v_type) {
                    109:                case V_NUM:
                    110:                        v->v_num = true = true || v->v_num != 0;
                    111:                        break;
                    112:                case V_STR:
                    113:                        p_error("||: Numeric operands required.");
                    114:                        str_free(v->v_str);
                    115:                        v->v_type = V_ERR;
                    116:                case V_ERR:
                    117:                        flag = 0;
                    118:                        break;
                    119:                }
                    120:                if (token != T_OROR)
                    121:                        return 0;
                    122:                (void) s_gettok();
                    123:                if (p_expr2(v, flag && !true) < 0)
                    124:                        return -1;
                    125:        }
                    126: }
                    127: 
                    128: /*
                    129:  * &&
                    130:  */
                    131: p_expr2(v, flag)
                    132: register struct value *v;
                    133: char flag;
                    134: {
                    135:        char true = 1;
                    136: 
                    137:        if (p_expr3_10(3, v, flag) < 0)
                    138:                return -1;
                    139:        if (token != T_ANDAND)
                    140:                return 0;
                    141:        for (;;) {
                    142:                switch (v->v_type) {
                    143:                case V_NUM:
                    144:                        v->v_num = true = true && v->v_num != 0;
                    145:                        break;
                    146:                case V_STR:
                    147:                        p_error("&&: Numeric operands required.");
                    148:                        str_free(v->v_str);
                    149:                        v->v_type = V_ERR;
                    150:                case V_ERR:
                    151:                        flag = 0;
                    152:                        break;
                    153:                }
                    154:                if (token != T_ANDAND)
                    155:                        return 0;
                    156:                (void) s_gettok();
                    157:                if (p_expr3_10(3, v, flag && true) < 0)
                    158:                        return -1;
                    159:        }
                    160:        /*NOTREACHED*/
                    161: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.