File:  [local] / rpl / rplawk / awk.h
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: #include <assert.h>
   26: 
   27: typedef double  Awkfloat;
   28: 
   29: /* unsigned char is more trouble than it's worth */
   30: 
   31: typedef unsigned char uschar;
   32: 
   33: #define xfree(a)    { if ((a) != NULL) { free((void *) (a)); (a) = NULL; } }
   34: 
   35: #define NN(p)   ((p) ? (p) : "(null)")  /* guaranteed non-null for dprintf 
   36: */
   37: #define DEBUG
   38: #ifdef  DEBUG
   39:             /* uses have to be doubly parenthesized */
   40: #   define  dprintf(x)  if (dbg) printf x
   41: #else
   42: #   define  dprintf(x)
   43: #endif
   44: 
   45: extern int  compile_time;   /* 1 if compiling, 0 if running */
   46: extern int  safe;       /* 0 => unsafe, 1 => safe */
   47: 
   48: #define RECSIZE (8 * 1024)  /* sets limit on records, fields, etc., etc. */
   49: extern int  recsize;    /* size of current record, orig RECSIZE */
   50: 
   51: extern char **FS;
   52: extern char **RS;
   53: extern char **ORS;
   54: extern char **OFS;
   55: extern char **OFMT;
   56: extern Awkfloat *NR;
   57: extern Awkfloat *FNR;
   58: extern Awkfloat *NF;
   59: extern char **FILENAME;
   60: extern char **SUBSEP;
   61: extern Awkfloat *RSTART;
   62: extern Awkfloat *RLENGTH;
   63: 
   64: extern char *record;    /* points to $0 */
   65: extern int  lineno;     /* line number in awk program */
   66: extern int  errorflag;  /* 1 if error has occurred */
   67: extern int  donefld;    /* 1 if record broken into fields */
   68: extern int  donerec;    /* 1 if record is valid (no fld has changed */
   69: extern char inputFS[];  /* FS at time of input, for field splitting */
   70: 
   71: extern int  dbg;
   72: 
   73: extern  char    *patbeg;    /* beginning of pattern matched */
   74: extern  int patlen;     /* length of pattern matched.  set in b.c */
   75: 
   76: /* Cell:  all information about a variable or constant */
   77: 
   78: typedef struct Cell {
   79:     uschar  ctype;      /* OCELL, OBOOL, OJUMP, etc. */
   80:     uschar  csub;       /* CCON, CTEMP, CFLD, etc. */
   81:     char    *nval;      /* name, for variables only */
   82:     char    *sval;      /* string value */
   83:     Awkfloat fval;      /* value as number */
   84:     int  tval;      /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
   85:     struct Cell *cnext; /* ptr to next if chained */
   86: } Cell;
   87: 
   88: typedef struct Array {      /* symbol table array */
   89:     int nelem;      /* elements in table right now */
   90:     int size;       /* size of tab */
   91:     Cell    **tab;      /* hash table pointers */
   92: } Array;
   93: 
   94: #define NSYMTAB 50  /* initial size of a symbol table */
   95: extern Array    *symtab;
   96: 
   97: extern Cell *nrloc;     /* NR */
   98: extern Cell *fnrloc;    /* FNR */
   99: extern Cell *nfloc;     /* NF */
  100: extern Cell *rstartloc; /* RSTART */
  101: extern Cell *rlengthloc;    /* RLENGTH */
  102: 
  103: /* Cell.tval values: */
  104: #define NUM 01  /* number value is valid */
  105: #define STR 02  /* string value is valid */
  106: #define DONTFREE 04 /* string space is not freeable */
  107: #define CON 010 /* this is a constant */
  108: #define ARR 020 /* this is an array */
  109: #define FCN 040 /* this is a function name */
  110: #define FLD 0100    /* this is a field $1, $2, ... */
  111: #define REC 0200    /* this is $0 */
  112: 
  113: 
  114: /* function types */
  115: #define FLENGTH 1
  116: #define FSQRT   2
  117: #define FEXP    3
  118: #define FLOG    4
  119: #define FINT    5
  120: #define FSYSTEM 6
  121: #define FRAND   7
  122: #define FSRAND  8
  123: #define FSIN    9
  124: #define FCOS    10
  125: #define FATAN   11
  126: #define FTOUPPER 12
  127: #define FTOLOWER 13
  128: #define FFLUSH  14
  129: 
  130: /* Node:  parse tree is made of nodes, with Cell's at bottom */
  131: 
  132: typedef struct Node {
  133:     int ntype;
  134:     struct  Node *nnext;
  135:     int lineno;
  136:     int nobj;
  137:     struct  Node *narg[1];  /* variable: actual size set by calling malloc */
  138: } Node;
  139: 
  140: #define NIL ((Node *) 0)
  141: 
  142: extern Node *winner;
  143: extern Node *nullstat;
  144: extern Node *nullnode;
  145: 
  146: /* ctypes */
  147: #define OCELL   1
  148: #define OBOOL   2
  149: #define OJUMP   3
  150: 
  151: /* Cell subtypes: csub */
  152: #define CFREE   7
  153: #define CCOPY   6
  154: #define CCON    5
  155: #define CTEMP   4
  156: #define CNAME   3 
  157: #define CVAR    2
  158: #define CFLD    1
  159: #define CUNK    0
  160: 
  161: /* bool subtypes */
  162: #define BTRUE   11
  163: #define BFALSE  12
  164: 
  165: /* jump subtypes */
  166: #define JEXIT   21
  167: #define JNEXT   22
  168: #define JBREAK  23
  169: #define JCONT   24
  170: #define JRET    25
  171: #define JNEXTFILE   26
  172: 
  173: /* node types */
  174: #define NVALUE  1
  175: #define NSTAT   2
  176: #define NEXPR   3
  177: 
  178: 
  179: extern  int pairstack[], paircnt;
  180: 
  181: #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
  182: #define isvalue(n)  ((n)->ntype == NVALUE)
  183: #define isexpr(n)   ((n)->ntype == NEXPR)
  184: #define isjump(n)   ((n)->ctype == OJUMP)
  185: #define isexit(n)   ((n)->csub == JEXIT)
  186: #define isbreak(n)  ((n)->csub == JBREAK)
  187: #define iscont(n)   ((n)->csub == JCONT)
  188: #define isnext(n)   ((n)->csub == JNEXT || (n)->csub == JNEXTFILE)
  189: #define isret(n)    ((n)->csub == JRET)
  190: #define isrec(n)    ((n)->tval & REC)
  191: #define isfld(n)    ((n)->tval & FLD)
  192: #define isstr(n)    ((n)->tval & STR)
  193: #define isnum(n)    ((n)->tval & NUM)
  194: #define isarr(n)    ((n)->tval & ARR)
  195: #define isfcn(n)    ((n)->tval & FCN)
  196: #define istrue(n)   ((n)->csub == BTRUE)
  197: #define istemp(n)   ((n)->csub == CTEMP)
  198: #define isargument(n)   ((n)->nobj == ARG)
  199: /* #define freeable(p)  (!((p)->tval & DONTFREE)) */
  200: #define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR )
  201: 
  202: /* structures used by regular expression matching machinery, mostly b.c: */
  203: 
  204: #define NCHARS  (256+3)     /* 256 handles 8-bit chars; 128 does 7-bit */
  205:                 /* watch out in match(), etc. */
  206: #define NSTATES 32
  207: 
  208: typedef struct rrow {
  209:     long    ltype;  /* long avoids pointer warnings on 64-bit */
  210:     union {
  211:         int i;
  212:         Node *np;
  213:         uschar *up;
  214:     } lval;     /* because Al stores a pointer in it! */
  215:     int *lfollow;
  216: } rrow;
  217: 
  218: typedef struct fa {
  219:     uschar  gototab[NSTATES][NCHARS];
  220:     uschar  out[NSTATES];
  221:     uschar  *restr;
  222:     int *posns[NSTATES];
  223:     int anchor;
  224:     int use;
  225:     int initstat;
  226:     int curstat;
  227:     int accept;
  228:     int reset;
  229:     struct  rrow re[1]; /* variable: actual size set by calling malloc */
  230: } fa;
  231: 
  232: 
  233: #include "proto.h"

CVSweb interface <joel.bertrand@systella.fr>