xref: /plan9/sys/src/cmd/awk/awk.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier Copyright (c) 1989 AT&T
33e12c5d1SDavid du Colombier 	All Rights Reserved
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T.
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier The copyright notice above does not evidence any
83e12c5d1SDavid du Colombier actual or intended publication of such source code.
93e12c5d1SDavid du Colombier */
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier typedef double	Awkfloat;
123e12c5d1SDavid du Colombier typedef	/*unsigned*/ char uchar;
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier #define	xfree(a)	{ if ((a) != NULL) { free((char *) a); a = NULL; } }
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier #define	DEBUG
173e12c5d1SDavid du Colombier #ifdef	DEBUG
183e12c5d1SDavid du Colombier 			/* uses have to be doubly parenthesized */
193e12c5d1SDavid du Colombier #	define	dprintf(x)	if (dbg) printf x
203e12c5d1SDavid du Colombier #else
213e12c5d1SDavid du Colombier #	define	dprintf(x)
223e12c5d1SDavid du Colombier #endif
233e12c5d1SDavid du Colombier 
243e12c5d1SDavid du Colombier extern	char	errbuf[200];
253e12c5d1SDavid du Colombier #define	ERROR	sprintf(errbuf,
263e12c5d1SDavid du Colombier #define	FATAL	), error(1, errbuf)
273e12c5d1SDavid du Colombier #define	WARNING	), error(0, errbuf)
283e12c5d1SDavid du Colombier #define	SYNTAX	), yyerror(errbuf)
293e12c5d1SDavid du Colombier 
303e12c5d1SDavid du Colombier extern int	compile_time;	/* 1 if compiling, 0 if running */
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier #define	RECSIZE	(3 * 1024)	/* sets limit on records, fields, etc., etc. */
33*219b2ee8SDavid du Colombier extern int	recsize;	/* variable version */
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier extern uchar	**FS;
363e12c5d1SDavid du Colombier extern uchar	**RS;
373e12c5d1SDavid du Colombier extern uchar	**ORS;
383e12c5d1SDavid du Colombier extern uchar	**OFS;
393e12c5d1SDavid du Colombier extern uchar	**OFMT;
403e12c5d1SDavid du Colombier extern Awkfloat *NR;
413e12c5d1SDavid du Colombier extern Awkfloat *FNR;
423e12c5d1SDavid du Colombier extern Awkfloat *NF;
433e12c5d1SDavid du Colombier extern uchar	**FILENAME;
443e12c5d1SDavid du Colombier extern uchar	**SUBSEP;
453e12c5d1SDavid du Colombier extern Awkfloat *RSTART;
463e12c5d1SDavid du Colombier extern Awkfloat *RLENGTH;
473e12c5d1SDavid du Colombier 
48*219b2ee8SDavid du Colombier extern uchar	*record;	/* points to $0 */
49*219b2ee8SDavid du Colombier extern int	lineno;		/* line number in awk program */
50*219b2ee8SDavid du Colombier extern int	errorflag;	/* 1 if error has occurred */
513e12c5d1SDavid du Colombier extern int	donefld;	/* 1 if record broken into fields */
523e12c5d1SDavid du Colombier extern int	donerec;	/* 1 if record is valid (no fld has changed */
533e12c5d1SDavid du Colombier 
54*219b2ee8SDavid du Colombier extern int	dbg;
55*219b2ee8SDavid du Colombier 
563e12c5d1SDavid du Colombier #define	CBUFLEN	400
573e12c5d1SDavid du Colombier extern uchar	cbuf[CBUFLEN];	/* miscellaneous character collection */
583e12c5d1SDavid du Colombier 
593e12c5d1SDavid du Colombier extern	uchar	*patbeg;	/* beginning of pattern matched */
60*219b2ee8SDavid du Colombier extern	int	patlen;		/* length of pattern matched.  set in b.c */
613e12c5d1SDavid du Colombier 
623e12c5d1SDavid du Colombier /* Cell:  all information about a variable or constant */
633e12c5d1SDavid du Colombier 
643e12c5d1SDavid du Colombier typedef struct Cell {
653e12c5d1SDavid du Colombier 	uchar	ctype;		/* OCELL, OBOOL, OJUMP, etc. */
663e12c5d1SDavid du Colombier 	uchar	csub;		/* CCON, CTEMP, CFLD, etc. */
673e12c5d1SDavid du Colombier 	uchar	*nval;		/* name, for variables only */
683e12c5d1SDavid du Colombier 	uchar	*sval;		/* string value */
693e12c5d1SDavid du Colombier 	Awkfloat fval;		/* value as number */
703e12c5d1SDavid du Colombier 	unsigned tval;		/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
713e12c5d1SDavid du Colombier 	struct Cell *cnext;	/* ptr to next if chained */
723e12c5d1SDavid du Colombier } Cell;
733e12c5d1SDavid du Colombier 
743e12c5d1SDavid du Colombier typedef struct {		/* symbol table array */
753e12c5d1SDavid du Colombier 	int	nelem;		/* elements in table right now */
763e12c5d1SDavid du Colombier 	int	size;		/* size of tab */
773e12c5d1SDavid du Colombier 	Cell	**tab;		/* hash table pointers */
783e12c5d1SDavid du Colombier } Array;
793e12c5d1SDavid du Colombier 
803e12c5d1SDavid du Colombier #define	NSYMTAB	50	/* initial size of a symbol table */
813e12c5d1SDavid du Colombier extern Array	*symtab;
823e12c5d1SDavid du Colombier 
833e12c5d1SDavid du Colombier extern Cell	*recloc;	/* location of input record */
843e12c5d1SDavid du Colombier extern Cell	*nrloc;		/* NR */
853e12c5d1SDavid du Colombier extern Cell	*fnrloc;	/* FNR */
863e12c5d1SDavid du Colombier extern Cell	*nfloc;		/* NF */
873e12c5d1SDavid du Colombier extern Cell	*rstartloc;	/* RSTART */
883e12c5d1SDavid du Colombier extern Cell	*rlengthloc;	/* RLENGTH */
893e12c5d1SDavid du Colombier 
903e12c5d1SDavid du Colombier /* Cell.tval values: */
913e12c5d1SDavid du Colombier #define	NUM	01	/* number value is valid */
923e12c5d1SDavid du Colombier #define	STR	02	/* string value is valid */
933e12c5d1SDavid du Colombier #define DONTFREE 04	/* string space is not freeable */
943e12c5d1SDavid du Colombier #define	CON	010	/* this is a constant */
953e12c5d1SDavid du Colombier #define	ARR	020	/* this is an array */
963e12c5d1SDavid du Colombier #define	FCN	040	/* this is a function name */
973e12c5d1SDavid du Colombier #define FLD	0100	/* this is a field $1, $2, ... */
983e12c5d1SDavid du Colombier #define	REC	0200	/* this is $0 */
993e12c5d1SDavid du Colombier 
1003e12c5d1SDavid du Colombier 
1013e12c5d1SDavid du Colombier /* function types */
1023e12c5d1SDavid du Colombier #define	FLENGTH	1
1033e12c5d1SDavid du Colombier #define	FSQRT	2
1043e12c5d1SDavid du Colombier #define	FEXP	3
1053e12c5d1SDavid du Colombier #define	FLOG	4
1063e12c5d1SDavid du Colombier #define	FINT	5
1073e12c5d1SDavid du Colombier #define	FSYSTEM	6
1083e12c5d1SDavid du Colombier #define	FRAND	7
1093e12c5d1SDavid du Colombier #define	FSRAND	8
1103e12c5d1SDavid du Colombier #define	FSIN	9
1113e12c5d1SDavid du Colombier #define	FCOS	10
1123e12c5d1SDavid du Colombier #define	FATAN	11
1133e12c5d1SDavid du Colombier #define	FTOUPPER 12
1143e12c5d1SDavid du Colombier #define	FTOLOWER 13
1153e12c5d1SDavid du Colombier #define	FFLUSH	14
116*219b2ee8SDavid du Colombier #define	FUTF		15
1173e12c5d1SDavid du Colombier 
1183e12c5d1SDavid du Colombier /* Node:  parse tree is made of nodes, with Cell's at bottom */
1193e12c5d1SDavid du Colombier 
1203e12c5d1SDavid du Colombier typedef struct Node {
1213e12c5d1SDavid du Colombier 	int	ntype;
1223e12c5d1SDavid du Colombier 	struct	Node *nnext;
1233e12c5d1SDavid du Colombier 	int	lineno;
1243e12c5d1SDavid du Colombier 	int	nobj;
1253e12c5d1SDavid du Colombier 	struct Node *narg[1];	/* variable: actual size set by calling malloc */
1263e12c5d1SDavid du Colombier } Node;
1273e12c5d1SDavid du Colombier 
1283e12c5d1SDavid du Colombier #define	NIL	((Node *) 0)
1293e12c5d1SDavid du Colombier 
1303e12c5d1SDavid du Colombier extern Node	*winner;
1313e12c5d1SDavid du Colombier extern Node	*nullstat;
1323e12c5d1SDavid du Colombier extern Node	*nullnode;
1333e12c5d1SDavid du Colombier 
1343e12c5d1SDavid du Colombier /* ctypes */
1353e12c5d1SDavid du Colombier #define OCELL	1
1363e12c5d1SDavid du Colombier #define OBOOL	2
1373e12c5d1SDavid du Colombier #define OJUMP	3
1383e12c5d1SDavid du Colombier 
1393e12c5d1SDavid du Colombier /* Cell subtypes: csub */
1403e12c5d1SDavid du Colombier #define	CFREE	7
1413e12c5d1SDavid du Colombier #define CCOPY	6
1423e12c5d1SDavid du Colombier #define CCON	5
1433e12c5d1SDavid du Colombier #define CTEMP	4
1443e12c5d1SDavid du Colombier #define CNAME	3
1453e12c5d1SDavid du Colombier #define CVAR	2
1463e12c5d1SDavid du Colombier #define CFLD	1
1473e12c5d1SDavid du Colombier 
1483e12c5d1SDavid du Colombier /* bool subtypes */
1493e12c5d1SDavid du Colombier #define BTRUE	11
1503e12c5d1SDavid du Colombier #define BFALSE	12
1513e12c5d1SDavid du Colombier 
1523e12c5d1SDavid du Colombier /* jump subtypes */
1533e12c5d1SDavid du Colombier #define JEXIT	21
1543e12c5d1SDavid du Colombier #define JNEXT	22
1553e12c5d1SDavid du Colombier #define	JBREAK	23
1563e12c5d1SDavid du Colombier #define	JCONT	24
1573e12c5d1SDavid du Colombier #define	JRET	25
1583e12c5d1SDavid du Colombier 
1593e12c5d1SDavid du Colombier /* node types */
1603e12c5d1SDavid du Colombier #define NVALUE	1
1613e12c5d1SDavid du Colombier #define NSTAT	2
1623e12c5d1SDavid du Colombier #define NEXPR	3
1633e12c5d1SDavid du Colombier #define	NFIELD	4
1643e12c5d1SDavid du Colombier 
1653e12c5d1SDavid du Colombier 
1663e12c5d1SDavid du Colombier extern	int	pairstack[], paircnt;
1673e12c5d1SDavid du Colombier 
1683e12c5d1SDavid du Colombier #define notlegal(n)	(n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
1693e12c5d1SDavid du Colombier #define isvalue(n)	((n)->ntype == NVALUE)
1703e12c5d1SDavid du Colombier #define isexpr(n)	((n)->ntype == NEXPR)
1713e12c5d1SDavid du Colombier #define isjump(n)	((n)->ctype == OJUMP)
1723e12c5d1SDavid du Colombier #define isexit(n)	((n)->csub == JEXIT)
1733e12c5d1SDavid du Colombier #define	isbreak(n)	((n)->csub == JBREAK)
1743e12c5d1SDavid du Colombier #define	iscont(n)	((n)->csub == JCONT)
1753e12c5d1SDavid du Colombier #define	isnext(n)	((n)->csub == JNEXT)
1763e12c5d1SDavid du Colombier #define	isret(n)	((n)->csub == JRET)
1773e12c5d1SDavid du Colombier #define isstr(n)	((n)->tval & STR)
1783e12c5d1SDavid du Colombier #define isnum(n)	((n)->tval & NUM)
1793e12c5d1SDavid du Colombier #define isarr(n)	((n)->tval & ARR)
1803e12c5d1SDavid du Colombier #define isfunc(n)	((n)->tval & FCN)
1813e12c5d1SDavid du Colombier #define istrue(n)	((n)->csub == BTRUE)
1823e12c5d1SDavid du Colombier #define istemp(n)	((n)->csub == CTEMP)
1833e12c5d1SDavid du Colombier #define	isargument(n)	((n)->nobj == ARG)
184*219b2ee8SDavid du Colombier #define freeable(p)	(!((p)->tval & DONTFREE))
1853e12c5d1SDavid du Colombier 
1863e12c5d1SDavid du Colombier #include "proto.h"
187