Annotation of rpl/rplawk/awk.h, revision 1.2

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: #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>