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>