You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
6.6 KiB
241 lines
6.6 KiB
/**************************************************************** |
|
Copyright (C) Lucent Technologies 1997 |
|
All Rights Reserved |
|
|
|
Permission to use, copy, modify, and distribute this software and |
|
its documentation for any purpose and without fee is hereby |
|
granted, provided that the above copyright notice appear in all |
|
copies and that both that the copyright notice and this |
|
permission notice and warranty disclaimer appear in supporting |
|
documentation, and that the name Lucent Technologies or any of |
|
its entities not be used in advertising or publicity pertaining |
|
to distribution of the software without specific, written prior |
|
permission. |
|
|
|
LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. |
|
IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY |
|
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER |
|
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, |
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF |
|
THIS SOFTWARE. |
|
****************************************************************/ |
|
|
|
#include <assert.h> |
|
|
|
typedef double Awkfloat; |
|
|
|
/* unsigned char is more trouble than it's worth */ |
|
|
|
typedef unsigned char uschar; |
|
|
|
#define xfree(a) { if ((a) != NULL) { free((void *) (a)); (a) = NULL; } } |
|
|
|
#define NN(p) ((p) ? (p) : "(null)") /* guaranteed non-null for dprintf |
|
*/ |
|
#define DEBUG |
|
#ifdef DEBUG |
|
/* uses have to be doubly parenthesized */ |
|
# define dprintf(x) if (dbg) printf x |
|
#else |
|
# define dprintf(x) |
|
#endif |
|
|
|
extern int compile_time; /* 1 if compiling, 0 if running */ |
|
extern int safe; /* 0 => unsafe, 1 => safe */ |
|
|
|
#define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */ |
|
extern int recsize; /* size of current record, orig RECSIZE */ |
|
|
|
extern char **FS; |
|
extern char **RS; |
|
extern char **ORS; |
|
extern char **OFS; |
|
extern char **OFMT; |
|
extern Awkfloat *NR; |
|
extern Awkfloat *FNR; |
|
extern Awkfloat *NF; |
|
extern char **FILENAME; |
|
extern char **SUBSEP; |
|
extern Awkfloat *RSTART; |
|
extern Awkfloat *RLENGTH; |
|
|
|
extern char *record; /* points to $0 */ |
|
extern int lineno; /* line number in awk program */ |
|
extern int errorflag; /* 1 if error has occurred */ |
|
extern int donefld; /* 1 if record broken into fields */ |
|
extern int donerec; /* 1 if record is valid (no fld has changed */ |
|
extern char inputFS[]; /* FS at time of input, for field splitting */ |
|
|
|
extern int dbg; |
|
|
|
extern char *patbeg; /* beginning of pattern matched */ |
|
extern int patlen; /* length of pattern matched. set in b.c */ |
|
|
|
/* Cell: all information about a variable or constant */ |
|
|
|
typedef struct Cell { |
|
uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */ |
|
uschar csub; /* CCON, CTEMP, CFLD, etc. */ |
|
char *nval; /* name, for variables only */ |
|
char *sval; /* string value */ |
|
Awkfloat fval; /* value as number */ |
|
int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE|CONVC|CONVO */ |
|
char *fmt; /* CONVFMT/OFMT value used to convert from number */ |
|
struct Cell *cnext; /* ptr to next if chained */ |
|
} Cell; |
|
|
|
typedef struct Array { /* symbol table array */ |
|
int nelem; /* elements in table right now */ |
|
int size; /* size of tab */ |
|
Cell **tab; /* hash table pointers */ |
|
} Array; |
|
|
|
#define NSYMTAB 50 /* initial size of a symbol table */ |
|
extern Array *symtab; |
|
|
|
extern Cell *nrloc; /* NR */ |
|
extern Cell *fnrloc; /* FNR */ |
|
extern Cell *fsloc; /* FS */ |
|
extern Cell *nfloc; /* NF */ |
|
extern Cell *ofsloc; /* OFS */ |
|
extern Cell *orsloc; /* ORS */ |
|
extern Cell *rsloc; /* RS */ |
|
extern Cell *rstartloc; /* RSTART */ |
|
extern Cell *rlengthloc; /* RLENGTH */ |
|
extern Cell *subseploc; /* SUBSEP */ |
|
|
|
/* Cell.tval values: */ |
|
#define NUM 01 /* number value is valid */ |
|
#define STR 02 /* string value is valid */ |
|
#define DONTFREE 04 /* string space is not freeable */ |
|
#define CON 010 /* this is a constant */ |
|
#define ARR 020 /* this is an array */ |
|
#define FCN 040 /* this is a function name */ |
|
#define FLD 0100 /* this is a field $1, $2, ... */ |
|
#define REC 0200 /* this is $0 */ |
|
#define CONVC 0400 /* string was converted from number via CONVFMT */ |
|
#define CONVO 01000 /* string was converted from number via OFMT */ |
|
|
|
|
|
/* function types */ |
|
#define FLENGTH 1 |
|
#define FSQRT 2 |
|
#define FEXP 3 |
|
#define FLOG 4 |
|
#define FINT 5 |
|
#define FSYSTEM 6 |
|
#define FRAND 7 |
|
#define FSRAND 8 |
|
#define FSIN 9 |
|
#define FCOS 10 |
|
#define FATAN 11 |
|
#define FTOUPPER 12 |
|
#define FTOLOWER 13 |
|
#define FFLUSH 14 |
|
|
|
/* Node: parse tree is made of nodes, with Cell's at bottom */ |
|
|
|
typedef struct Node { |
|
int ntype; |
|
struct Node *nnext; |
|
int lineno; |
|
int nobj; |
|
struct Node *narg[1]; /* variable: actual size set by calling malloc */ |
|
} Node; |
|
|
|
#define NIL ((Node *) 0) |
|
|
|
extern Node *winner; |
|
extern Node *nullstat; |
|
extern Node *nullnode; |
|
|
|
/* ctypes */ |
|
#define OCELL 1 |
|
#define OBOOL 2 |
|
#define OJUMP 3 |
|
|
|
/* Cell subtypes: csub */ |
|
#define CFREE 7 |
|
#define CCOPY 6 |
|
#define CCON 5 |
|
#define CTEMP 4 |
|
#define CNAME 3 |
|
#define CVAR 2 |
|
#define CFLD 1 |
|
#define CUNK 0 |
|
|
|
/* bool subtypes */ |
|
#define BTRUE 11 |
|
#define BFALSE 12 |
|
|
|
/* jump subtypes */ |
|
#define JEXIT 21 |
|
#define JNEXT 22 |
|
#define JBREAK 23 |
|
#define JCONT 24 |
|
#define JRET 25 |
|
#define JNEXTFILE 26 |
|
|
|
/* node types */ |
|
#define NVALUE 1 |
|
#define NSTAT 2 |
|
#define NEXPR 3 |
|
|
|
|
|
extern int pairstack[], paircnt; |
|
|
|
#define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc) |
|
#define isvalue(n) ((n)->ntype == NVALUE) |
|
#define isexpr(n) ((n)->ntype == NEXPR) |
|
#define isjump(n) ((n)->ctype == OJUMP) |
|
#define isexit(n) ((n)->csub == JEXIT) |
|
#define isbreak(n) ((n)->csub == JBREAK) |
|
#define iscont(n) ((n)->csub == JCONT) |
|
#define isnext(n) ((n)->csub == JNEXT || (n)->csub == JNEXTFILE) |
|
#define isret(n) ((n)->csub == JRET) |
|
#define isrec(n) ((n)->tval & REC) |
|
#define isfld(n) ((n)->tval & FLD) |
|
#define isstr(n) ((n)->tval & STR) |
|
#define isnum(n) ((n)->tval & NUM) |
|
#define isarr(n) ((n)->tval & ARR) |
|
#define isfcn(n) ((n)->tval & FCN) |
|
#define istrue(n) ((n)->csub == BTRUE) |
|
#define istemp(n) ((n)->csub == CTEMP) |
|
#define isargument(n) ((n)->nobj == ARG) |
|
/* #define freeable(p) (!((p)->tval & DONTFREE)) */ |
|
#define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR ) |
|
|
|
/* structures used by regular expression matching machinery, mostly b.c: */ |
|
|
|
#define NCHARS (256+3) /* 256 handles 8-bit chars; 128 does 7-bit */ |
|
/* watch out in match(), etc. */ |
|
#define NSTATES 32 |
|
|
|
typedef struct rrow { |
|
long ltype; /* long avoids pointer warnings on 64-bit */ |
|
union { |
|
int i; |
|
Node *np; |
|
uschar *up; |
|
} lval; /* because Al stores a pointer in it! */ |
|
int *lfollow; |
|
} rrow; |
|
|
|
typedef struct fa { |
|
uschar gototab[NSTATES][NCHARS]; |
|
uschar out[NSTATES]; |
|
uschar *restr; |
|
int *posns[NSTATES]; |
|
int anchor; |
|
int use; |
|
int initstat; |
|
int curstat; |
|
int accept; |
|
int reset; |
|
struct rrow re[1]; /* variable: actual size set by calling malloc */ |
|
} fa; |
|
|
|
|
|
#include "proto.h"
|
|
|