[BACK]Return to parser1.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / window

Annotation of src/usr.bin/window/parser1.c, Revision 1.3

1.3     ! downsj      1: /*     $OpenBSD$       */
1.1       deraadt     2: /*     $NetBSD: parser1.c,v 1.3 1995/09/28 10:34:31 tls Exp $  */
                      3:
                      4: /*
                      5:  * Copyright (c) 1983, 1993
                      6:  *     The Regents of the University of California.  All rights reserved.
                      7:  *
                      8:  * This code is derived from software contributed to Berkeley by
                      9:  * Edward Wang at The University of California, Berkeley.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
                     19:  * 3. All advertising materials mentioning features or use of this software
                     20:  *    must display the following acknowledgement:
                     21:  *     This product includes software developed by the University of
                     22:  *     California, Berkeley and its contributors.
                     23:  * 4. Neither the name of the University nor the names of its contributors
                     24:  *    may be used to endorse or promote products derived from this software
                     25:  *    without specific prior written permission.
                     26:  *
                     27:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     28:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     29:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     30:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     31:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     32:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     33:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     34:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     35:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     36:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     37:  * SUCH DAMAGE.
                     38:  */
                     39:
                     40: #ifndef lint
                     41: #if 0
                     42: static char sccsid[] = "@(#)parser1.c  8.1 (Berkeley) 6/6/93";
                     43: #else
1.3     ! downsj     44: static char rcsid[] = "$OpenBSD$";
1.1       deraadt    45: #endif
                     46: #endif /* not lint */
                     47:
                     48: #include "parser.h"
                     49:
                     50: p_start()
                     51: {
                     52:        char flag = 1;
                     53:
                     54:        (void) s_gettok();
                     55:        for (;;) {
                     56:                p_statementlist(flag);
                     57:                if (token == T_EOF || p_abort())
                     58:                        break;
                     59:                flag = 0;
                     60:                p_synerror();
                     61:                while (token != T_EOL && token != T_EOF) {
                     62:                        if (token == T_STR)
                     63:                                str_free(token_str);
                     64:                        (void) s_gettok();
                     65:                }
                     66:                if (token == T_EOL)
                     67:                        (void) s_gettok();
                     68:                p_clearerr();
                     69:        }
                     70: }
                     71:
                     72: p_statementlist(flag)
                     73: char flag;
                     74: {
                     75:        for (; p_statement(flag) >= 0; p_clearerr())
                     76:                ;
                     77: }
                     78:
                     79: p_statement(flag)
                     80: char flag;
                     81: {
                     82:        switch (token) {
                     83:        case T_EOL:
                     84:                (void) s_gettok();
                     85:                return 0;
                     86:        case T_IF:
                     87:                return p_if(flag);
                     88:        default:
                     89:                return p_expression(flag);
                     90:        }
                     91: }
                     92:
                     93: p_if(flag)
                     94: char flag;
                     95: {
                     96:        struct value t;
                     97:        char true = 0;
                     98:
                     99: top:
                    100:        (void) s_gettok();
                    101:
                    102:        if (p_expr(&t, flag) < 0) {
                    103:                p_synerror();
                    104:                return -1;
                    105:        }
                    106:        switch (t.v_type) {
                    107:        case V_NUM:
                    108:                true = !true && t.v_num != 0;
                    109:                break;
                    110:        case V_STR:
                    111:                p_error("if: Numeric value required.");
                    112:                str_free(t.v_str);
                    113:        case V_ERR:
                    114:                flag = 0;
                    115:                break;
                    116:        }
                    117:
                    118:        if (token != T_THEN) {
                    119:                p_synerror();
                    120:                return -1;
                    121:        }
                    122:
                    123:        (void) s_gettok();
                    124:        p_statementlist(flag && true);
                    125:        if (p_erred())
                    126:                return -1;
                    127:
                    128:        if (token == T_ELSIF)
                    129:                goto top;
                    130:
                    131:        if (token == T_ELSE) {
                    132:                (void) s_gettok();
                    133:                p_statementlist(flag && !true);
                    134:                if (p_erred())
                    135:                        return -1;
                    136:        }
                    137:
                    138:        if (token == T_ENDIF) {
                    139:                (void) s_gettok();
                    140:                return 0;
                    141:        }
                    142:
                    143:        p_synerror();
                    144:        return -1;
                    145: }
                    146:
                    147: p_expression(flag)
                    148: char flag;
                    149: {
                    150:        struct value t;
                    151:        char *cmd;
                    152:        int p_function(), p_assign();
                    153:
                    154:        switch (token) {
                    155:        case T_NUM:
                    156:                t.v_type = V_NUM;
                    157:                t.v_num = token_num;
                    158:                (void) s_gettok();
                    159:                break;
                    160:        case T_STR:
                    161:                t.v_type = V_STR;
                    162:                t.v_str = token_str;
                    163:                (void) s_gettok();
                    164:                break;
                    165:        default:
                    166:                if (p_expr(&t, flag) < 0)
                    167:                        return -1;
                    168:                if (token == T_EOF) {
                    169:                        val_free(t);
                    170:                        return 0;
                    171:                }
                    172:        }
                    173:        if (token != T_ASSIGN && p_convstr(&t) < 0)
                    174:                return -1;
                    175:        cmd = t.v_type == V_STR ? t.v_str : 0;
                    176:        if ((*(token == T_ASSIGN ? p_assign : p_function))(cmd, &t, flag) < 0) {
                    177:                if (cmd)
                    178:                        str_free(cmd);
                    179:                return -1;
                    180:        }
                    181:        if (cmd)
                    182:                str_free(cmd);
                    183:        val_free(t);
                    184:        if (token == T_EOL)
                    185:                (void) s_gettok();
                    186:        else if (token != T_EOF) {
                    187:                p_synerror();
                    188:                return -1;
                    189:        }
                    190:        return 0;
                    191: }
                    192:
                    193: p_convstr(v)
                    194: register struct value *v;
                    195: {
                    196:        if (v->v_type != V_NUM)
                    197:                return 0;
                    198:        if ((v->v_str = str_itoa(v->v_num)) == 0) {
                    199:                p_memerror();
                    200:                v->v_type = V_ERR;
                    201:                return -1;
                    202:        }
                    203:        v->v_type = V_STR;
                    204:        return 0;
                    205: }
                    206:
                    207: p_synerror()
                    208: {
                    209:        if (!cx.x_synerred) {
                    210:                cx.x_synerred = cx.x_erred = 1;
                    211:                error("Syntax error.");
                    212:        }
                    213: }
                    214:
                    215: /*VARARGS1*/
                    216: p_error(msg, a, b, c)
                    217: char *msg;
                    218: {
                    219:        if (!cx.x_erred) {
                    220:                cx.x_erred = 1;
                    221:                error(msg, a, b, c);
                    222:        }
                    223: }
                    224:
                    225: p_memerror()
                    226: {
                    227:        cx.x_erred = cx.x_abort = 1;
                    228:        error("Out of memory.");
                    229: }