/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. *//*Copyright (c) Lucent Technologies 1997 All Rights Reserved*/typedef double Awkfloat;/* unsigned char is more trouble than it's worth */typedef unsigned char uschar;#define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } }#define DEBUG#ifdef DEBUG /* uses have to be doubly parenthesized */# define dprintf(x) if (dbg) printf x#else# define dprintf(x)#endifextern char errbuf[];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 */ 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 *nfloc; /* NF */extern Cell *rstartloc; /* RSTART */extern Cell *rlengthloc; /* RLENGTH *//* 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 *//* 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#define FUTF 15/* 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 3extern 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)#define isnextfile(n) ((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 )#include "proto.h"
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
/*
Copyright (c) Lucent Technologies 1997
All Rights Reserved
*/
typedef double Awkfloat;
/* unsigned char is more trouble than it's worth */
typedef unsigned char uschar;
#define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } }
#define DEBUG
#ifdef DEBUG
/* uses have to be doubly parenthesized */
# define dprintf(x) if (dbg) printf x
#else
# define dprintf(x)
#endif
extern char errbuf[];
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 */
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 *nfloc; /* NF */
extern Cell *rstartloc; /* RSTART */
extern Cell *rlengthloc; /* RLENGTH */
/* 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 */
/* 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
#define FUTF 15
/* 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)
#define isnextfile(n) ((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 )
#include "proto.h"