Annotation of rpl/rplawk/awk.h, 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: #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>