Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/****************************************************************
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"