xref: /plan9/sys/src/cmd/awk/awk.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier /*
2*7dd7cddfSDavid du Colombier Copyright (c) Lucent Technologies 1997
33e12c5d1SDavid du Colombier 	All Rights Reserved
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier */
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier typedef double	Awkfloat;
8*7dd7cddfSDavid du Colombier 
9*7dd7cddfSDavid du Colombier /* unsigned char is more trouble than it's worth */
10*7dd7cddfSDavid du Colombier 
11*7dd7cddfSDavid du Colombier typedef	unsigned char uschar;
123e12c5d1SDavid du Colombier 
133e12c5d1SDavid du Colombier #define	xfree(a)	{ if ((a) != NULL) { free((char *) a); a = NULL; } }
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier #define	DEBUG
163e12c5d1SDavid du Colombier #ifdef	DEBUG
173e12c5d1SDavid du Colombier 			/* uses have to be doubly parenthesized */
183e12c5d1SDavid du Colombier #	define	dprintf(x)	if (dbg) printf x
193e12c5d1SDavid du Colombier #else
203e12c5d1SDavid du Colombier #	define	dprintf(x)
213e12c5d1SDavid du Colombier #endif
223e12c5d1SDavid du Colombier 
23*7dd7cddfSDavid du Colombier extern	char	errbuf[];
243e12c5d1SDavid du Colombier 
253e12c5d1SDavid du Colombier extern int	compile_time;	/* 1 if compiling, 0 if running */
26*7dd7cddfSDavid du Colombier extern int	safe;		/* 0 => unsafe, 1 => safe */
273e12c5d1SDavid du Colombier 
28*7dd7cddfSDavid du Colombier #define	RECSIZE	(8 * 1024)	/* sets limit on records, fields, etc., etc. */
29*7dd7cddfSDavid du Colombier extern int	recsize;	/* size of current record, orig RECSIZE */
303e12c5d1SDavid du Colombier 
31*7dd7cddfSDavid du Colombier extern char	**FS;
32*7dd7cddfSDavid du Colombier extern char	**RS;
33*7dd7cddfSDavid du Colombier extern char	**ORS;
34*7dd7cddfSDavid du Colombier extern char	**OFS;
35*7dd7cddfSDavid du Colombier extern char	**OFMT;
363e12c5d1SDavid du Colombier extern Awkfloat *NR;
373e12c5d1SDavid du Colombier extern Awkfloat *FNR;
383e12c5d1SDavid du Colombier extern Awkfloat *NF;
39*7dd7cddfSDavid du Colombier extern char	**FILENAME;
40*7dd7cddfSDavid du Colombier extern char	**SUBSEP;
413e12c5d1SDavid du Colombier extern Awkfloat *RSTART;
423e12c5d1SDavid du Colombier extern Awkfloat *RLENGTH;
433e12c5d1SDavid du Colombier 
44*7dd7cddfSDavid du Colombier extern char	*record;	/* points to $0 */
45219b2ee8SDavid du Colombier extern int	lineno;		/* line number in awk program */
46219b2ee8SDavid du Colombier extern int	errorflag;	/* 1 if error has occurred */
473e12c5d1SDavid du Colombier extern int	donefld;	/* 1 if record broken into fields */
483e12c5d1SDavid du Colombier extern int	donerec;	/* 1 if record is valid (no fld has changed */
49*7dd7cddfSDavid du Colombier extern char	inputFS[];	/* FS at time of input, for field splitting */
503e12c5d1SDavid du Colombier 
51219b2ee8SDavid du Colombier extern int	dbg;
52219b2ee8SDavid du Colombier 
53*7dd7cddfSDavid du Colombier extern	char	*patbeg;	/* beginning of pattern matched */
54219b2ee8SDavid du Colombier extern	int	patlen;		/* length of pattern matched.  set in b.c */
553e12c5d1SDavid du Colombier 
563e12c5d1SDavid du Colombier /* Cell:  all information about a variable or constant */
573e12c5d1SDavid du Colombier 
583e12c5d1SDavid du Colombier typedef struct Cell {
59*7dd7cddfSDavid du Colombier 	uschar	ctype;		/* OCELL, OBOOL, OJUMP, etc. */
60*7dd7cddfSDavid du Colombier 	uschar	csub;		/* CCON, CTEMP, CFLD, etc. */
61*7dd7cddfSDavid du Colombier 	char	*nval;		/* name, for variables only */
62*7dd7cddfSDavid du Colombier 	char	*sval;		/* string value */
633e12c5d1SDavid du Colombier 	Awkfloat fval;		/* value as number */
64*7dd7cddfSDavid du Colombier 	int	 tval;		/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
653e12c5d1SDavid du Colombier 	struct Cell *cnext;	/* ptr to next if chained */
663e12c5d1SDavid du Colombier } Cell;
673e12c5d1SDavid du Colombier 
68*7dd7cddfSDavid du Colombier typedef struct Array {		/* symbol table array */
693e12c5d1SDavid du Colombier 	int	nelem;		/* elements in table right now */
703e12c5d1SDavid du Colombier 	int	size;		/* size of tab */
713e12c5d1SDavid du Colombier 	Cell	**tab;		/* hash table pointers */
723e12c5d1SDavid du Colombier } Array;
733e12c5d1SDavid du Colombier 
743e12c5d1SDavid du Colombier #define	NSYMTAB	50	/* initial size of a symbol table */
753e12c5d1SDavid du Colombier extern Array	*symtab;
763e12c5d1SDavid du Colombier 
773e12c5d1SDavid du Colombier extern Cell	*nrloc;		/* NR */
783e12c5d1SDavid du Colombier extern Cell	*fnrloc;	/* FNR */
793e12c5d1SDavid du Colombier extern Cell	*nfloc;		/* NF */
803e12c5d1SDavid du Colombier extern Cell	*rstartloc;	/* RSTART */
813e12c5d1SDavid du Colombier extern Cell	*rlengthloc;	/* RLENGTH */
823e12c5d1SDavid du Colombier 
833e12c5d1SDavid du Colombier /* Cell.tval values: */
843e12c5d1SDavid du Colombier #define	NUM	01	/* number value is valid */
853e12c5d1SDavid du Colombier #define	STR	02	/* string value is valid */
863e12c5d1SDavid du Colombier #define DONTFREE 04	/* string space is not freeable */
873e12c5d1SDavid du Colombier #define	CON	010	/* this is a constant */
883e12c5d1SDavid du Colombier #define	ARR	020	/* this is an array */
893e12c5d1SDavid du Colombier #define	FCN	040	/* this is a function name */
903e12c5d1SDavid du Colombier #define FLD	0100	/* this is a field $1, $2, ... */
913e12c5d1SDavid du Colombier #define	REC	0200	/* this is $0 */
923e12c5d1SDavid du Colombier 
933e12c5d1SDavid du Colombier 
943e12c5d1SDavid du Colombier /* function types */
953e12c5d1SDavid du Colombier #define	FLENGTH	1
963e12c5d1SDavid du Colombier #define	FSQRT	2
973e12c5d1SDavid du Colombier #define	FEXP	3
983e12c5d1SDavid du Colombier #define	FLOG	4
993e12c5d1SDavid du Colombier #define	FINT	5
1003e12c5d1SDavid du Colombier #define	FSYSTEM	6
1013e12c5d1SDavid du Colombier #define	FRAND	7
1023e12c5d1SDavid du Colombier #define	FSRAND	8
1033e12c5d1SDavid du Colombier #define	FSIN	9
1043e12c5d1SDavid du Colombier #define	FCOS	10
1053e12c5d1SDavid du Colombier #define	FATAN	11
1063e12c5d1SDavid du Colombier #define	FTOUPPER 12
1073e12c5d1SDavid du Colombier #define	FTOLOWER 13
1083e12c5d1SDavid du Colombier #define	FFLUSH	14
109219b2ee8SDavid du Colombier #define	FUTF	15
1103e12c5d1SDavid du Colombier 
1113e12c5d1SDavid du Colombier /* Node:  parse tree is made of nodes, with Cell's at bottom */
1123e12c5d1SDavid du Colombier 
1133e12c5d1SDavid du Colombier typedef struct Node {
1143e12c5d1SDavid du Colombier 	int	ntype;
1153e12c5d1SDavid du Colombier 	struct	Node *nnext;
1163e12c5d1SDavid du Colombier 	int	lineno;
1173e12c5d1SDavid du Colombier 	int	nobj;
1183e12c5d1SDavid du Colombier 	struct	Node *narg[1];	/* variable: actual size set by calling malloc */
1193e12c5d1SDavid du Colombier } Node;
1203e12c5d1SDavid du Colombier 
1213e12c5d1SDavid du Colombier #define	NIL	((Node *) 0)
1223e12c5d1SDavid du Colombier 
1233e12c5d1SDavid du Colombier extern Node	*winner;
1243e12c5d1SDavid du Colombier extern Node	*nullstat;
1253e12c5d1SDavid du Colombier extern Node	*nullnode;
1263e12c5d1SDavid du Colombier 
1273e12c5d1SDavid du Colombier /* ctypes */
1283e12c5d1SDavid du Colombier #define OCELL	1
1293e12c5d1SDavid du Colombier #define OBOOL	2
1303e12c5d1SDavid du Colombier #define OJUMP	3
1313e12c5d1SDavid du Colombier 
1323e12c5d1SDavid du Colombier /* Cell subtypes: csub */
1333e12c5d1SDavid du Colombier #define	CFREE	7
1343e12c5d1SDavid du Colombier #define CCOPY	6
1353e12c5d1SDavid du Colombier #define CCON	5
1363e12c5d1SDavid du Colombier #define CTEMP	4
1373e12c5d1SDavid du Colombier #define CNAME	3
1383e12c5d1SDavid du Colombier #define CVAR	2
1393e12c5d1SDavid du Colombier #define CFLD	1
140*7dd7cddfSDavid du Colombier #define	CUNK	0
1413e12c5d1SDavid du Colombier 
1423e12c5d1SDavid du Colombier /* bool subtypes */
1433e12c5d1SDavid du Colombier #define BTRUE	11
1443e12c5d1SDavid du Colombier #define BFALSE	12
1453e12c5d1SDavid du Colombier 
1463e12c5d1SDavid du Colombier /* jump subtypes */
1473e12c5d1SDavid du Colombier #define JEXIT	21
1483e12c5d1SDavid du Colombier #define JNEXT	22
1493e12c5d1SDavid du Colombier #define	JBREAK	23
1503e12c5d1SDavid du Colombier #define	JCONT	24
1513e12c5d1SDavid du Colombier #define	JRET	25
152*7dd7cddfSDavid du Colombier #define	JNEXTFILE	26
1533e12c5d1SDavid du Colombier 
1543e12c5d1SDavid du Colombier /* node types */
1553e12c5d1SDavid du Colombier #define NVALUE	1
1563e12c5d1SDavid du Colombier #define NSTAT	2
1573e12c5d1SDavid du Colombier #define NEXPR	3
1583e12c5d1SDavid du Colombier 
1593e12c5d1SDavid du Colombier 
1603e12c5d1SDavid du Colombier extern	int	pairstack[], paircnt;
1613e12c5d1SDavid du Colombier 
1623e12c5d1SDavid du Colombier #define notlegal(n)	(n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
1633e12c5d1SDavid du Colombier #define isvalue(n)	((n)->ntype == NVALUE)
1643e12c5d1SDavid du Colombier #define isexpr(n)	((n)->ntype == NEXPR)
1653e12c5d1SDavid du Colombier #define isjump(n)	((n)->ctype == OJUMP)
1663e12c5d1SDavid du Colombier #define isexit(n)	((n)->csub == JEXIT)
1673e12c5d1SDavid du Colombier #define	isbreak(n)	((n)->csub == JBREAK)
1683e12c5d1SDavid du Colombier #define	iscont(n)	((n)->csub == JCONT)
1693e12c5d1SDavid du Colombier #define	isnext(n)	((n)->csub == JNEXT)
170*7dd7cddfSDavid du Colombier #define	isnextfile(n)	((n)->csub == JNEXTFILE)
1713e12c5d1SDavid du Colombier #define	isret(n)	((n)->csub == JRET)
172*7dd7cddfSDavid du Colombier #define isrec(n)	((n)->tval & REC)
173*7dd7cddfSDavid du Colombier #define isfld(n)	((n)->tval & FLD)
1743e12c5d1SDavid du Colombier #define isstr(n)	((n)->tval & STR)
1753e12c5d1SDavid du Colombier #define isnum(n)	((n)->tval & NUM)
1763e12c5d1SDavid du Colombier #define isarr(n)	((n)->tval & ARR)
177*7dd7cddfSDavid du Colombier #define isfcn(n)	((n)->tval & FCN)
1783e12c5d1SDavid du Colombier #define istrue(n)	((n)->csub == BTRUE)
1793e12c5d1SDavid du Colombier #define istemp(n)	((n)->csub == CTEMP)
1803e12c5d1SDavid du Colombier #define	isargument(n)	((n)->nobj == ARG)
181*7dd7cddfSDavid du Colombier /* #define freeable(p)	(!((p)->tval & DONTFREE)) */
182*7dd7cddfSDavid du Colombier #define freeable(p)	( ((p)->tval & (STR|DONTFREE)) == STR )
1833e12c5d1SDavid du Colombier 
1843e12c5d1SDavid du Colombier #include "proto.h"
185