#ifndef AWK_H
#define AWK_H
#include <assert.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libintl.h>
#include <limits.h>
typedef double Awkfloat;
typedef unsigned char uschar;
#define xfree(a) { if ((a) != NULL) { free((void *)(a)); (a) = NULL; } }
#define NN(p) ((p) ? (p) : "(null)")
#define DEBUG
#ifdef DEBUG
#define dprintf(x) if (dbg) (void) printf x
#else
#define dprintf(x)
#endif
extern int compile_time;
extern int safe;
#define FLD_INCR 64
#define LINE_INCR 256
#define RECSIZE (8 * 1024)
extern size_t recsize;
#define expand_buf(p, n, r) \
if (*(n) == 0 || (r) >= (*(n) - 1)) r_expand_buf(p, n, r)
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;
extern size_t recsize;
extern int errorflag;
extern int donefld;
extern int donerec;
extern char *patbeg;
extern int patlen;
typedef struct Cell {
uschar ctype;
uschar csub;
char *nval;
char *sval;
Awkfloat fval;
int tval;
char *fmt;
struct Cell *cnext;
} Cell;
typedef struct Array {
int nelem;
int size;
Cell **tab;
} Array;
#define NSYMTAB 50
extern Array *symtab, *makesymtab(int);
extern Cell *setsymtab(const char *, const char *, Awkfloat,
unsigned int, Array *);
extern Cell *lookup(const char *, Array *);
extern Cell *recloc;
extern Cell *nrloc;
extern Cell *fnrloc;
extern Cell *fsloc;
extern Cell *nfloc;
extern Cell *ofsloc;
extern Cell *orsloc;
extern Cell *rsloc;
extern Cell *rtloc;
extern Cell *rstartloc;
extern Cell *rlengthloc;
extern Cell *subseploc;
extern Cell *symtabloc;
#define NUM 01
#define STR 02
#define DONTFREE 04
#define CON 010
#define ARR 020
#define FCN 040
#define FLD 0100
#define REC 0200
#define CONVC 0400
#define CONVO 01000
extern Awkfloat setfval(Cell *, Awkfloat);
extern Awkfloat getfval(Cell *);
extern char *setsval(Cell *, const char *);
extern char *getsval(Cell *);
extern char *getpssval(Cell *);
extern char *tostring(const char *);
extern char *tokname(int);
extern char *qstring(const char *, int);
#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
typedef struct Node {
int ntype;
struct Node *nnext;
off_t lineno;
int nobj;
struct Node *narg[1];
} Node;
#define NIL ((Node *)0)
extern Node *winner;
extern Node *nullstat;
extern Node *nullnode;
#define OCELL 1
#define OBOOL 2
#define OJUMP 3
#define CFREE 7
#define CCOPY 6
#define CCON 5
#define CTEMP 4
#define CNAME 3
#define CVAR 2
#define CFLD 1
#define CUNK 0
#define BTRUE 11
#define BFALSE 12
#define JEXIT 21
#define JNEXT 22
#define JBREAK 23
#define JCONT 24
#define JRET 25
#define JNEXTFILE 26
#define NVALUE 1
#define NSTAT 2
#define NEXPR 3
#define NFIELD 4
extern Cell *(*proctab[])(Node **, int);
extern Cell *nullproc(Node **, int);
extern int *pairstack, paircnt;
extern Node *stat1(int, Node *), *stat2(int, Node *, Node *);
extern Node *stat3(int, Node *, Node *, Node *);
extern Node *stat4(int, Node *, Node *, Node *, Node *);
extern Node *pa2stat(Node *, Node *, Node *);
extern Node *op1(int, Node *), *op2(int, Node *, Node *);
extern Node *op3(int, Node *, Node *, Node *);
extern Node *op4(int, Node *, Node *, Node *, Node *);
extern Node *linkum(Node *, Node *), *celltonode(Cell *, int);
extern Node *rectonode(void), *exptostat(Node *);
extern Node *makearr(Node *);
#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 freeable(p) (((p)->tval & (STR|DONTFREE)) == STR)
#define NCHARS (256+3)
#define NSTATES 32
typedef struct rrow {
long ltype;
union {
int i;
Node *np;
uschar *up;
} lval;
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];
} fa;
extern int yylex(void);
extern void startreg(void);
extern int input(void);
extern void unput(int);
extern void unputstr(const char *);
extern int yylook(void);
extern int yyback(int *, int);
extern int yyinput(void);
extern void defn(Cell *, Node *, Node *);
extern int ptoi(void *);
extern Node *itonp(int);
extern int isarg(const char *);
extern fa *makedfa(const char *, int);
extern int nematch(fa *, const char *);
extern int match(fa *, const char *);
extern int pmatch(fa *, const char *);
extern void SYNTAX(const char *, ...);
extern void FATAL(const char *, ...) __attribute__((__noreturn__));
extern void WARNING(const char *, ...);
extern void error(void);
extern void nextfile(void);
extern void savefs(void);
extern int isclvar(const char *);
extern int is_number(const char *);
extern void setclvar(char *);
extern int readrec(char **, size_t *, FILE *);
extern void bracecheck(void);
extern void recinit(unsigned int n);
extern void syminit(void);
extern int yyerror(const char *);
extern void fldbld(void);
extern void recbld(void);
extern int getrec(char **, size_t *, int);
extern Cell *fieldadr(int);
extern void newfld(int);
extern int fldidx(Cell *);
extern double errcheck(double, const char *);
extern void fpecatch(int);
extern void r_expand_buf(char **, size_t *, size_t);
extern void makefields(int, int);
extern void growfldtab(int n);
extern void setlastfld(int n);
extern int dbg;
extern char *lexprog;
extern int compile_time;
extern char *cursource(void);
extern int pgetc(void);
extern void syminit(void);
extern void arginit(int, char **);
extern void envinit(char **);
extern void freesymtab(Cell *);
extern void freeelem(Cell *, const char *);
extern void funnyvar(Cell *, const char *);
extern int hash(const char *, int);
extern Awkfloat *ARGC;
extern void run(Node *);
extern const char *filename(FILE *);
extern int adjbuf(char **pb, size_t *sz, size_t min, size_t q,
char **pbp, const char *what);
extern int paircnt;
extern Node *winner;
#ifndef input
extern int input(void);
#endif
extern int yyparse(void);
extern FILE *yyin;
extern off_t lineno;
extern Cell *nullproc(Node **, int);
extern Cell *program(Node **, int);
extern Cell *boolop(Node **, int);
extern Cell *relop(Node **, int);
extern Cell *array(Node **, int);
extern Cell *indirect(Node **, int);
extern Cell *substr(Node **, int);
extern Cell *sub(Node **, int);
extern Cell *gsub(Node **, int);
extern Cell *sindex(Node **, int);
extern Cell *awksprintf(Node **, int);
extern Cell *arith(Node **, int);
extern Cell *incrdecr(Node **, int);
extern Cell *cat(Node **, int);
extern Cell *pastat(Node **, int);
extern Cell *dopa2(Node **, int);
extern Cell *matchop(Node **, int);
extern Cell *intest(Node **, int);
extern Cell *awkprintf(Node **, int);
extern Cell *printstat(Node **, int);
extern Cell *closefile(Node **, int);
extern Cell *awkdelete(Node **, int);
extern Cell *split(Node **, int);
extern Cell *assign(Node **, int);
extern Cell *condexpr(Node **, int);
extern Cell *ifstat(Node **, int);
extern Cell *whilestat(Node **, int);
extern Cell *forstat(Node **, int);
extern Cell *dostat(Node **, int);
extern Cell *instat(Node **, int);
extern Cell *jump(Node **, int);
extern Cell *bltin(Node **, int);
extern Cell *call(Node **, int);
extern Cell *arg(Node **, int);
extern Cell *getnf(Node **, int);
extern Cell *awkgetline(Node **, int);
#endif