#ifndef AWK_H
#define AWK_H
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#include <stdlib.h>
#include <regex.h>
#include <errno.h>
#include <sys/types.h>
#include <locale.h>
#include <wchar.h>
#include <widec.h>
#define YYMAXDEPTH 300
#define YYSSIZE 300
#define MAXDIGINT 19
#define FNULL ((FILE *)0)
#define NNULL ((NODE *)0)
#define SNULL ((STRING)0)
#define LARGE INT_MAX
#define NPFILE 32
#define NRECUR 3000
#define M_LDATA 1
#ifdef M_LDATA
#define NLINE 20000
#define NFIELD 4000
#define NBUCKET 1024
#else
#define NLINE 2048
#define NFIELD 1024
#define NBUCKET 256
#endif
#define NSNODE 40
#define NCONTEXT 50
#define hashbuck(n) ((n)&(NBUCKET-1))
#if BSD
int bcmp();
#define memcmp(b1, b2, n) bcmp(b1, b2, n)
void bcopy();
#define memcpy(b1, b2, n) bcopy(b2, b1, (int)n)
#endif
#define vlook(n) vlookup(n, 0)
typedef double REAL;
typedef long long INT;
typedef wchar_t *STRING;
typedef struct NODE *(*FUNCTION)(struct NODE *np);
typedef void *REGEXP;
typedef struct NODE {
ushort_t n_type;
struct NODE *n_next;
ushort_t n_flags;
union {
struct {
ushort_t N_hash;
struct NODE *N_alink;
union {
struct {
STRING N_string;
size_t N_strlen;
} n_str;
INT N_int;
REAL N_real;
FUNCTION N_function;
struct NODE *N_ufunc;
} n_tun;
wchar_t N_name[1];
} n_term;
struct {
struct NODE *N_left;
struct NODE *N_right;
ushort_t N_lineno;
} n_op;
struct {
struct NODE *N_left;
struct NODE *N_right;
REGEXP N_regexp;
} n_re;
} n_un;
} NODE;
#define n_hash n_un.n_term.N_hash
#define n_scope n_un.n_term.N_hash
#define n_alink n_un.n_term.N_alink
#define n_string n_un.n_term.n_tun.n_str.N_string
#define n_strlen n_un.n_term.n_tun.n_str.N_strlen
#define n_int n_un.n_term.n_tun.N_int
#define n_real n_un.n_term.n_tun.N_real
#define n_function n_un.n_term.n_tun.N_function
#define n_ufunc n_un.n_term.n_tun.N_ufunc
#define n_name n_un.n_term.N_name
#define n_left n_un.n_op.N_left
#define n_right n_un.n_op.N_right
#define n_lineno n_un.n_op.N_lineno
#define n_keywtype n_un.n_op.N_lineno
#define n_regexp n_un.n_re.N_regexp
#define FALLOC 0x01
#define FSTATIC 0x00
#define FMATCH 0x02
#define FSPECIAL 0x04
#define FINARRAY 0x08
#define FNOALLOC 0x10
#define FSENSE 0x20
#define FSAVE (FSPECIAL|FINARRAY)
#define FINT 0x40
#define FREAL 0x80
#define FSTRING 0x100
#define FNONTOK 0x200
#define FVINT 0x400
#define FVREAL 0x800
#define FLARRAY 0x1000
#define isleaf(f) (!((f)&FNONTOK))
#define isstring(f) ((f)&FSTRING)
#define isastring(f) (((f)&(FSTRING|FALLOC)) == (FSTRING|FALLOC))
#define isnumber(f) ((f)&(FINT|FVINT|FREAL|FVREAL))
#define isreal(f) ((f)&(FREAL|FVREAL))
#define isint(f) ((f)&(FINT|FVINT))
#if defined(DOS)
#if defined(__386__)
#define AWK_PROTOTYPE M_ETCDIR(awkrunf.dos)
#define AWK_LPROTOTYPE M_ETCDIR(awkrunf.dos)
#else
#define AWK_PROTOTYPE M_ETCDIR(awkrun.dos)
#define AWK_LPROTOTYPE M_ETCDIR(awkrunl.dos)
#endif
#elif defined(OS2)
#define AWK_PROTOTYPE M_ETCDIR(awkrun.os2)
#elif defined(NT)
#define AWK_PROTOTYPE M_ETCDIR(awkrun.nt)
#else
#define AWK_PROTOTYPE M_ETCDIR(awkrun.mod)
#endif
#ifndef DOS
#define near
#endif
typedef wchar_t near *LOCCHARP;
typedef struct RESERVED {
LOCCHARP r_name;
int r_type;
INT r_ivalue;
STRING r_svalue;
} RESERVED;
typedef struct RESFUNC {
LOCCHARP rf_name;
int rf_type;
FUNCTION rf_func;
} RESFUNC;
typedef struct OFILE {
ushort_t f_mode;
FILE *f_fp;
char *f_name;
} OFILE;
int yyparse(void);
#ifdef __WATCOMC__
#pragma aux yyerror aborts;
#pragma aux awkerr aborts;
#pragma aux awkperr aborts;
#endif
int yyerror(const char *msg, ...);
void awkerr(const char *fmt, ...) __NORETURN;
void awkperr(const char *fmt, ...);
void uexit(NODE *);
int yylex(void);
NODE *renode(wchar_t *restr);
wchar_t *emalloc(unsigned);
wchar_t *erealloc(wchar_t *, unsigned);
void awk(void);
void dobegin(void);
void doend(int status) __NORETURN;
int nextrecord(wchar_t *buf, FILE *fp);
wchar_t *defrecord(wchar_t *bp, int lim, FILE *fp);
wchar_t *charrecord(wchar_t *bp, int lim, FILE *fp);
wchar_t *multirecord(wchar_t *bp, int lim, FILE *fp);
wchar_t *whitefield(wchar_t **endp);
wchar_t *blackfield(wchar_t **endp);
wchar_t *refield(wchar_t **endp);
void s_print(NODE *np);
void s_prf(NODE *np);
size_t xprintf(NODE *np, FILE *fp, wchar_t **cp);
void awkclose(OFILE *op);
void strassign(NODE *np, STRING string, int flags, size_t length);
NODE *nassign(NODE *np, NODE *value);
NODE *assign(NODE *np, NODE *value);
void delarray(NODE *np);
NODE *node(int type, NODE *left, NODE *right);
NODE *intnode(INT i);
NODE *realnode(REAL r);
NODE *stringnode(STRING str, int aflag, size_t wcslen);
NODE *vlookup(wchar_t *name, int nocreate);
NODE *emptynode(int type, size_t nlength);
void freenode(NODE *np);
void execute(NODE *np);
INT exprint(NODE *np);
REAL exprreal(NODE *np);
STRING exprstring(NODE *np);
STRING strsave(wchar_t *string);
NODE *exprreduce(NODE *np);
NODE *getlist(NODE **npp);
NODE *symwalk(int *buckp, NODE **npp);
REGEXP getregexp(NODE *np);
void addsymtab(NODE *np);
void delsymtab(NODE *np, int fflag);
NODE * finstall(LOCCHARP name, FUNCTION f, int type);
void kinstall(LOCCHARP name, int type);
void fieldsplit(void);
void promote(NODE *);
NODE *f_exp(NODE *np);
NODE *f_int(NODE *np);
NODE *f_log(NODE *np);
NODE *f_sqrt(NODE *np);
NODE *f_getline(NODE *np);
NODE *f_index(NODE *np);
NODE *f_length(NODE *np);
NODE *f_split(NODE *np);
NODE *f_sprintf(NODE *np);
NODE *f_substr(NODE *np);
NODE *f_rand(NODE *np);
NODE *f_srand(NODE *np);
NODE *f_sin(NODE *np);
NODE *f_cos(NODE *np);
NODE *f_atan2(NODE *np);
NODE *f_sub(NODE *np);
NODE *f_gsub(NODE *np);
NODE *f_match(NODE *np);
NODE *f_system(NODE *np);
NODE *f_ord(NODE *np);
NODE *f_tolower(NODE *np);
NODE *f_toupper(NODE *np);
NODE *f_close(NODE *np);
NODE *f_asort(NODE *np);
extern wchar_t _null[];
extern char r[];
extern char w[];
extern wchar_t s_OFMT[];
extern wchar_t s_CONVFMT[];
extern wchar_t s_NR[];
extern wchar_t s_NF[];
extern wchar_t s_OFS[];
extern wchar_t s_ORS[];
extern wchar_t s_RS[];
extern wchar_t s_FS[];
extern wchar_t s_FNR[];
extern wchar_t s_SUBSEP[];
extern wchar_t s_ARGC[], s_ARGV[], s_ENVIRON[];
extern wchar_t s_FILENAME[], s_SYMTAB[];
extern wchar_t s_BEGIN[], s_END[], s_next[];
extern wchar_t _begin[], _end[];
extern wchar_t s_exp[], s_getline[], s_index[], s_int[], s_length[], s_log[];
extern wchar_t s_split[], s_sprintf[], s_sqrt[], s_substr[];
extern wchar_t s_rand[], s_srand[], s_sin[], s_cos[], s_atan2[];
extern wchar_t s_sub[], s_gsub[], s_match[], s_system[], s_ord[];
extern wchar_t s_toupper[], s_tolower[], s_asort[];
extern wchar_t s_close[];
extern wchar_t redelim;
extern unsigned char inprint;
extern unsigned char funparm;
extern unsigned char splitdone;
extern uint_t npattern;
extern uint_t nfield;
extern uint_t fcount;
extern uint_t phase;
extern uint_t running;
extern uchar_t catterm;
extern uint_t lexlast;
extern uint_t lineno;
extern uchar_t needsplit, needenviron, doing_begin, begin_getline;
extern ushort_t slevel;
extern ushort_t loopexit;
extern wchar_t radixpoint;
extern REGEXP resep;
extern RESERVED reserved[];
extern RESFUNC resfuncs[];
extern long NIOSTREAM;
extern OFILE *ofiles;
extern wchar_t *linebuf;
extern size_t lbuflen;
extern char interr[];
extern char nomem[];
extern NODE *symtab[NBUCKET];
extern NODE *yytree;
extern NODE *freelist;
extern wchar_t *(*awkrecord)(wchar_t *, int, FILE *);
extern wchar_t *(*awkfield)(wchar_t **);
extern NODE *constant;
extern NODE *const0;
extern NODE *const1;
extern NODE *constundef;
extern NODE *field0;
extern NODE *incNR;
extern NODE *incFNR;
extern NODE *clrFNR;
extern NODE *ARGVsubi;
extern NODE *varNR;
extern NODE *varFNR;
extern NODE *varNF;
extern NODE *varOFMT;
extern NODE *varCONVFMT;
extern NODE *varOFS;
extern NODE *varORS;
extern NODE *varFS;
extern NODE *varRS;
extern NODE *varARGC;
extern NODE *varSUBSEP;
extern NODE *varENVIRON;
extern NODE *varSYMTAB;
extern NODE *varFILENAME;
extern NODE *curnode;
extern NODE *inc_oper;
extern NODE *asn_oper;
extern char *mbunconvert(wchar_t *);
extern wchar_t *mbstowcsdup(char *);
extern char *wcstombsdup(wchar_t *);
#ifdef M_NUMSIZE
#define NUMSIZE M_NUMSIZE
#else
#define NUMSIZE 30
#endif
#define M_MB_L(s) L##s
#ifdef __STDC__
#define ANSI(x) x
#else
#define const
#define signed
#define volatile
#define ANSI(x) ()
#endif
#define isWblank(x) (((x) == ' ' || (x) == '\t') ? 1 : 0)
#define REGWMATCH_T int_regwmatch_t
#define REGWCOMP int_regwcomp
#define REGWEXEC int_regwexec
#define REGWFREE int_regwfree
#define REGWERROR int_regwerror
#define REGWDOSUBA int_regwdosuba
typedef struct {
const wchar_t *rm_sp, *rm_ep;
regoff_t rm_so, rm_eo;
} int_regwmatch_t;
extern int int_regwcomp(REGEXP *, const wchar_t *);
extern int int_regwexec(REGEXP, const wchar_t *, size_t,
int_regwmatch_t *, int);
extern void int_regwfree(REGEXP);
extern size_t int_regwerror(int, REGEXP, char *, size_t);
extern int int_regwdosuba(REGEXP, const wchar_t *,
const wchar_t *, wchar_t **, int, int *);
#endif