Annotation of rpl/rplawk/parse.c, revision 1.1

1.1     ! bertrand    1: /****************************************************************
        !             2: Copyright (C) Lucent Technologies 1997
        !             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 name Lucent Technologies or any of
        !            11: its entities not be used in advertising or publicity pertaining
        !            12: to distribution of the software without specific, written prior
        !            13: permission.
        !            14: 
        !            15: LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
        !            16: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
        !            17: IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
        !            18: SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            19: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
        !            20: IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
        !            21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
        !            22: 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 "ytab.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:        FATAL("out of space in nodealloc");
        !            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 *celltonode(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:    extern Cell *literal0;
        !           182:    return op1(INDIRECT, celltonode(literal0, CUNK));
        !           183: }
        !           184: 
        !           185: Node *makearr(Node *p)
        !           186: {
        !           187:    Cell *cp;
        !           188: 
        !           189:    if (isvalue(p)) {
        !           190:        cp = (Cell *) (p->narg[0]);
        !           191:        if (isfcn(cp))
        !           192:            SYNTAX( "%s is a function, not an array", cp->nval );
        !           193:        else if (!isarr(cp)) {
        !           194:            xfree(cp->sval);
        !           195:            cp->sval = (char *) makesymtab(NSYMTAB);
        !           196:            cp->tval = ARR;
        !           197:        }
        !           198:    }
        !           199:    return p;
        !           200: }
        !           201: 
        !           202: #define PA2NUM 50  /* max number of pat,pat patterns allowed */
        !           203: int    paircnt;        /* number of them in use */
        !           204: int    pairstack[PA2NUM];  /* state of each pat,pat */
        !           205: 
        !           206: Node *pa2stat(Node *a, Node *b, Node *c)   /* pat, pat {...} */
        !           207: {
        !           208:    Node *x;
        !           209: 
        !           210:    x = node4(PASTAT2, a, b, c, itonp(paircnt));
        !           211:    if (paircnt++ >= PA2NUM)
        !           212:        SYNTAX( "limited to %d pat,pat statements", PA2NUM );
        !           213:    x->ntype = NSTAT;
        !           214:    return(x);
        !           215: }
        !           216: 
        !           217: Node *linkum(Node *a, Node *b)
        !           218: {
        !           219:    Node *c;
        !           220: 
        !           221:    if (errorflag)  /* don't link things that are wrong */
        !           222:        return a;
        !           223:    if (a == NULL)
        !           224:        return(b);
        !           225:    else if (b == NULL)
        !           226:        return(a);
        !           227:    for (c = a; c->nnext != NULL; c = c->nnext)
        !           228:        ;
        !           229:    c->nnext = b;
        !           230:    return(a);
        !           231: }
        !           232: 
        !           233: void defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition, */
        !           234: {                  /*   body of function, arglist */
        !           235:    Node *p;
        !           236:    int n;
        !           237: 
        !           238:    if (isarr(v)) {
        !           239:        SYNTAX( "`%s' is an array name and a function name", v->nval );
        !           240:        return;
        !           241:    }
        !           242:    if (isarg(v->nval) != -1) {
        !           243:        SYNTAX( "`%s' is both function name and argument name", v->nval );
        !           244:        return;
        !           245:    }
        !           246: 
        !           247:    v->tval = FCN;
        !           248:    v->sval = (char *) st;
        !           249:    n = 0;  /* count arguments */
        !           250:    for (p = vl; p; p = p->nnext)
        !           251:        n++;
        !           252:    v->fval = n;
        !           253:    dprintf( ("defining func %s (%d args)\n", v->nval, n) );
        !           254: }
        !           255: 
        !           256: int isarg(const char *s)       /* is s in argument list for current function? */
        !           257: {          /* return -1 if not, otherwise arg # */
        !           258:    extern Node *arglist;
        !           259:    Node *p = arglist;
        !           260:    int n;
        !           261: 
        !           262:    for (n = 0; p != 0; p = p->nnext, n++)
        !           263:        if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0)
        !           264:            return n;
        !           265:    return -1;
        !           266: }
        !           267: 
        !           268: int ptoi(void *p)  /* convert pointer to integer */
        !           269: {
        !           270:    return (int) (long) p;  /* swearing that p fits, of course */
        !           271: }
        !           272: 
        !           273: Node *itonp(int i) /* and vice versa */
        !           274: {
        !           275:    return (Node *) (long) i;
        !           276: }

CVSweb interface <joel.bertrand@systella.fr>