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

Annotation of src/usr.bin/awk/parse.c, Revision 1.1

1.1     ! tholo       1: /****************************************************************
        !             2: Copyright (C) AT&T and Lucent Technologies 1996
        !             3: All Rights Reserved
        !             4:
        !             5: Permission to use, copy, modify, and distribute this software and
        !             6: its documentation for any purpose and without fee is hereby
        !             7: granted, provided that the above copyright notice appear in all
        !             8: copies and that both that the copyright notice and this
        !             9: permission notice and warranty disclaimer appear in supporting
        !            10: documentation, and that the names of AT&T or Lucent Technologies
        !            11: or any of their entities not be used in advertising or publicity
        !            12: pertaining to distribution of the software without specific,
        !            13: written prior permission.
        !            14:
        !            15: AT&T AND LUCENT DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
        !            16: SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
        !            17: FITNESS. IN NO EVENT SHALL AT&T OR LUCENT OR ANY OF THEIR
        !            18: ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
        !            19: DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
        !            20: DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
        !            21: OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
        !            22: USE OR PERFORMANCE OF THIS SOFTWARE.
        !            23: ****************************************************************/
        !            24:
        !            25: #define DEBUG
        !            26: #include <stdio.h>
        !            27: #include <string.h>
        !            28: #include <stdlib.h>
        !            29: #include "awk.h"
        !            30: #include "awkgram.h"
        !            31:
        !            32: Node *nodealloc(int n)
        !            33: {
        !            34:        Node *x;
        !            35:
        !            36:        x = (Node *) malloc(sizeof(Node) + (n-1)*sizeof(Node *));
        !            37:        if (x == NULL)
        !            38:                ERROR "out of space in nodealloc" FATAL;
        !            39:        x->nnext = NULL;
        !            40:        x->lineno = lineno;
        !            41:        return(x);
        !            42: }
        !            43:
        !            44: Node *exptostat(Node *a)
        !            45: {
        !            46:        a->ntype = NSTAT;
        !            47:        return(a);
        !            48: }
        !            49:
        !            50: Node *node1(int a, Node *b)
        !            51: {
        !            52:        Node *x;
        !            53:
        !            54:        x = nodealloc(1);
        !            55:        x->nobj = a;
        !            56:        x->narg[0]=b;
        !            57:        return(x);
        !            58: }
        !            59:
        !            60: Node *node2(int a, Node *b, Node *c)
        !            61: {
        !            62:        Node *x;
        !            63:
        !            64:        x = nodealloc(2);
        !            65:        x->nobj = a;
        !            66:        x->narg[0] = b;
        !            67:        x->narg[1] = c;
        !            68:        return(x);
        !            69: }
        !            70:
        !            71: Node *node3(int a, Node *b, Node *c, Node *d)
        !            72: {
        !            73:        Node *x;
        !            74:
        !            75:        x = nodealloc(3);
        !            76:        x->nobj = a;
        !            77:        x->narg[0] = b;
        !            78:        x->narg[1] = c;
        !            79:        x->narg[2] = d;
        !            80:        return(x);
        !            81: }
        !            82:
        !            83: Node *node4(int a, Node *b, Node *c, Node *d, Node *e)
        !            84: {
        !            85:        Node *x;
        !            86:
        !            87:        x = nodealloc(4);
        !            88:        x->nobj = a;
        !            89:        x->narg[0] = b;
        !            90:        x->narg[1] = c;
        !            91:        x->narg[2] = d;
        !            92:        x->narg[3] = e;
        !            93:        return(x);
        !            94: }
        !            95:
        !            96: Node *stat1(int a, Node *b)
        !            97: {
        !            98:        Node *x;
        !            99:
        !           100:        x = node1(a,b);
        !           101:        x->ntype = NSTAT;
        !           102:        return(x);
        !           103: }
        !           104:
        !           105: Node *stat2(int a, Node *b, Node *c)
        !           106: {
        !           107:        Node *x;
        !           108:
        !           109:        x = node2(a,b,c);
        !           110:        x->ntype = NSTAT;
        !           111:        return(x);
        !           112: }
        !           113:
        !           114: Node *stat3(int a, Node *b, Node *c, Node *d)
        !           115: {
        !           116:        Node *x;
        !           117:
        !           118:        x = node3(a,b,c,d);
        !           119:        x->ntype = NSTAT;
        !           120:        return(x);
        !           121: }
        !           122:
        !           123: Node *stat4(int a, Node *b, Node *c, Node *d, Node *e)
        !           124: {
        !           125:        Node *x;
        !           126:
        !           127:        x = node4(a,b,c,d,e);
        !           128:        x->ntype = NSTAT;
        !           129:        return(x);
        !           130: }
        !           131:
        !           132: Node *op1(int a, Node *b)
        !           133: {
        !           134:        Node *x;
        !           135:
        !           136:        x = node1(a,b);
        !           137:        x->ntype = NEXPR;
        !           138:        return(x);
        !           139: }
        !           140:
        !           141: Node *op2(int a, Node *b, Node *c)
        !           142: {
        !           143:        Node *x;
        !           144:
        !           145:        x = node2(a,b,c);
        !           146:        x->ntype = NEXPR;
        !           147:        return(x);
        !           148: }
        !           149:
        !           150: Node *op3(int a, Node *b, Node *c, Node *d)
        !           151: {
        !           152:        Node *x;
        !           153:
        !           154:        x = node3(a,b,c,d);
        !           155:        x->ntype = NEXPR;
        !           156:        return(x);
        !           157: }
        !           158:
        !           159: Node *op4(int a, Node *b, Node *c, Node *d, Node *e)
        !           160: {
        !           161:        Node *x;
        !           162:
        !           163:        x = node4(a,b,c,d,e);
        !           164:        x->ntype = NEXPR;
        !           165:        return(x);
        !           166: }
        !           167:
        !           168: Node *valtonode(Cell *a, int b)
        !           169: {
        !           170:        Node *x;
        !           171:
        !           172:        a->ctype = OCELL;
        !           173:        a->csub = b;
        !           174:        x = node1(0, (Node *) a);
        !           175:        x->ntype = NVALUE;
        !           176:        return(x);
        !           177: }
        !           178:
        !           179: Node *rectonode(void)  /* make $0 into a Node */
        !           180: {
        !           181:        return valtonode(recloc, CFLD);
        !           182: }
        !           183:
        !           184: Node *makearr(Node *p)
        !           185: {
        !           186:        Cell *cp;
        !           187:
        !           188:        if (isvalue(p)) {
        !           189:                cp = (Cell *) (p->narg[0]);
        !           190:                if (isfunc(cp))
        !           191:                        ERROR "%s is a function, not an array", cp->nval SYNTAX;
        !           192:                else if (!isarr(cp)) {
        !           193:                        xfree(cp->sval);
        !           194:                        cp->sval = (char *) makesymtab(NSYMTAB);
        !           195:                        cp->tval = ARR;
        !           196:                }
        !           197:        }
        !           198:        return p;
        !           199: }
        !           200:
        !           201: Node *pa2stat(Node *a, Node *b, Node *c)       /* pat, pat {...} */
        !           202: {
        !           203:        Node *x;
        !           204:
        !           205:        x = node4(PASTAT2, a, b, c, (Node *) paircnt);
        !           206:        paircnt++;
        !           207:        x->ntype = NSTAT;
        !           208:        return(x);
        !           209: }
        !           210:
        !           211: Node *linkum(Node *a, Node *b)
        !           212: {
        !           213:        Node *c;
        !           214:
        !           215:        if (errorflag)  /* don't link things that are wrong */
        !           216:                return a;
        !           217:        if (a == NULL)
        !           218:                return(b);
        !           219:        else if (b == NULL)
        !           220:                return(a);
        !           221:        for (c = a; c->nnext != NULL; c = c->nnext)
        !           222:                ;
        !           223:        c->nnext = b;
        !           224:        return(a);
        !           225: }
        !           226:
        !           227: void defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition, */
        !           228: {                                      /*   body of function, arglist */
        !           229:        Node *p;
        !           230:        int n;
        !           231:
        !           232:        if (isarr(v)) {
        !           233:                ERROR "`%s' is an array name and a function name", v->nval SYNTAX;
        !           234:                return;
        !           235:        }
        !           236:        v->tval = FCN;
        !           237:        v->sval = (char *) st;
        !           238:        n = 0;  /* count arguments */
        !           239:        for (p = vl; p; p = p->nnext)
        !           240:                n++;
        !           241:        v->fval = n;
        !           242:        dprintf( ("defining func %s (%d args)\n", v->nval, n) );
        !           243: }
        !           244:
        !           245: int isarg(char *s)             /* is s in argument list for current function? */
        !           246: {                      /* return -1 if not, otherwise arg # */
        !           247:        extern Node *arglist;
        !           248:        Node *p = arglist;
        !           249:        int n;
        !           250:
        !           251:        for (n = 0; p != 0; p = p->nnext, n++)
        !           252:                if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
        !           253:                        return n;
        !           254:        return -1;
        !           255: }