File:  [local] / rpl / rplawk / parse.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Wed Jun 12 09:48:22 2013 UTC (10 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_35, rpl-4_1_34, rpl-4_1_33, rpl-4_1_32, rpl-4_1_31, rpl-4_1_30, rpl-4_1_29, rpl-4_1_28, rpl-4_1_27, rpl-4_1_26, rpl-4_1_25, rpl-4_1_24, rpl-4_1_23, rpl-4_1_22, rpl-4_1_21, rpl-4_1_20, rpl-4_1_19, rpl-4_1_18, rpl-4_1_17, rpl-4_1_16, rpl-4_1_15, rpl-4_1_14, HEAD
Cohérence.

    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>