xref: /onnv-gate/usr/src/cmd/awk/awk.h (revision 13093:48f2dbca79a2)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
52615Snakanon  * Common Development and Distribution License (the "License").
62615Snakanon  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
21289Snakanon 
22289Snakanon /*
23*13093SRoger.Faulkner@Oracle.COM  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
24289Snakanon  */
25289Snakanon 
260Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
270Sstevel@tonic-gate /*	  All Rights Reserved  	*/
280Sstevel@tonic-gate 
29289Snakanon #ifndef AWK_H
30289Snakanon #define	AWK_H
310Sstevel@tonic-gate 
320Sstevel@tonic-gate #include <sys/types.h>
33289Snakanon #include <ctype.h>
34289Snakanon #include <stdio.h>
35289Snakanon #include <stdlib.h>
36289Snakanon #include <string.h>
37289Snakanon #include <libintl.h>
380Sstevel@tonic-gate #include <limits.h>
390Sstevel@tonic-gate 
400Sstevel@tonic-gate typedef double	Awkfloat;
410Sstevel@tonic-gate typedef	unsigned char uchar;
420Sstevel@tonic-gate 
430Sstevel@tonic-gate #define	xfree(a)	{ if ((a) != NULL) { free(a); a = NULL; } }
440Sstevel@tonic-gate 
450Sstevel@tonic-gate #define	DEBUG
460Sstevel@tonic-gate #ifdef	DEBUG
470Sstevel@tonic-gate 			/* uses have to be doubly parenthesized */
48289Snakanon #define	dprintf(x)	if (dbg) (void) printf x
490Sstevel@tonic-gate #else
50289Snakanon #define	dprintf(x)
510Sstevel@tonic-gate #endif
520Sstevel@tonic-gate 
530Sstevel@tonic-gate extern	char	errbuf[200];
54289Snakanon extern	void	error(int, char *);
55289Snakanon #define	ERROR	(void) snprintf(errbuf, sizeof (errbuf),
56289Snakanon /*CSTYLED*/
570Sstevel@tonic-gate #define	FATAL	), error(1, errbuf)
58289Snakanon /*CSTYLED*/
590Sstevel@tonic-gate #define	WARNING	), error(0, errbuf)
60289Snakanon /*CSTYLED*/
610Sstevel@tonic-gate #define	SYNTAX	), yyerror(errbuf)
62289Snakanon /*CSTYLED*/
63289Snakanon #define	CONT	)
640Sstevel@tonic-gate 
650Sstevel@tonic-gate extern int	compile_time;	/* 1 if compiling, 0 if running */
660Sstevel@tonic-gate 
67289Snakanon #define	FLD_INCR	64
68289Snakanon #define	LINE_INCR	256
690Sstevel@tonic-gate 
70289Snakanon /* ensure that there is extra 1 byte in the buffer */
71289Snakanon #define	expand_buf(p, n, r)	\
72289Snakanon 	if (*(n) == 0 || (r) >= (*(n) - 1)) r_expand_buf(p, n, r)
730Sstevel@tonic-gate 
740Sstevel@tonic-gate extern uchar	**FS;
750Sstevel@tonic-gate extern uchar	**RS;
760Sstevel@tonic-gate extern uchar	**ORS;
770Sstevel@tonic-gate extern uchar	**OFS;
780Sstevel@tonic-gate extern uchar	**OFMT;
790Sstevel@tonic-gate extern Awkfloat *NR;
800Sstevel@tonic-gate extern Awkfloat *FNR;
810Sstevel@tonic-gate extern Awkfloat *NF;
820Sstevel@tonic-gate extern uchar	**FILENAME;
830Sstevel@tonic-gate extern uchar	**SUBSEP;
840Sstevel@tonic-gate extern Awkfloat *RSTART;
850Sstevel@tonic-gate extern Awkfloat *RLENGTH;
860Sstevel@tonic-gate 
870Sstevel@tonic-gate extern uchar	*record;
88289Snakanon extern size_t	record_size;
890Sstevel@tonic-gate extern int	errorflag;
900Sstevel@tonic-gate extern int	donefld;	/* 1 if record broken into fields */
910Sstevel@tonic-gate extern int	donerec;	/* 1 if record is valid (no fld has changed */
920Sstevel@tonic-gate 
930Sstevel@tonic-gate extern	uchar	*patbeg;	/* beginning of pattern matched */
940Sstevel@tonic-gate extern	int	patlen;		/* length.  set in b.c */
950Sstevel@tonic-gate 
960Sstevel@tonic-gate /* Cell:  all information about a variable or constant */
970Sstevel@tonic-gate 
980Sstevel@tonic-gate typedef struct Cell {
990Sstevel@tonic-gate 	uchar	ctype;		/* OCELL, OBOOL, OJUMP, etc. */
1000Sstevel@tonic-gate 	uchar	csub;		/* CCON, CTEMP, CFLD, etc. */
1010Sstevel@tonic-gate 	uchar	*nval;		/* name, for variables only */
1020Sstevel@tonic-gate 	uchar	*sval;		/* string value */
1030Sstevel@tonic-gate 	Awkfloat fval;		/* value as number */
104289Snakanon 	unsigned tval;
105289Snakanon 		/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
1060Sstevel@tonic-gate 	struct Cell *cnext;	/* ptr to next if chained */
1070Sstevel@tonic-gate } Cell;
1080Sstevel@tonic-gate 
1090Sstevel@tonic-gate typedef struct {		/* symbol table array */
1100Sstevel@tonic-gate 	int	nelem;		/* elements in table right now */
1110Sstevel@tonic-gate 	int	size;		/* size of tab */
1120Sstevel@tonic-gate 	Cell	**tab;		/* hash table pointers */
1130Sstevel@tonic-gate } Array;
1140Sstevel@tonic-gate 
1150Sstevel@tonic-gate #define	NSYMTAB	50	/* initial size of a symbol table */
116289Snakanon extern Array	*symtab, *makesymtab(int);
117289Snakanon extern Cell	*setsymtab(uchar *, uchar *, Awkfloat, unsigned int, Array *);
118289Snakanon extern Cell	*lookup(uchar *, Array *);
1190Sstevel@tonic-gate 
1200Sstevel@tonic-gate extern Cell	*recloc;	/* location of input record */
1210Sstevel@tonic-gate extern Cell	*nrloc;		/* NR */
1220Sstevel@tonic-gate extern Cell	*fnrloc;	/* FNR */
1230Sstevel@tonic-gate extern Cell	*nfloc;		/* NF */
1240Sstevel@tonic-gate extern Cell	*rstartloc;	/* RSTART */
1250Sstevel@tonic-gate extern Cell	*rlengthloc;	/* RLENGTH */
1260Sstevel@tonic-gate 
1270Sstevel@tonic-gate /* Cell.tval values: */
1280Sstevel@tonic-gate #define	NUM	01	/* number value is valid */
1290Sstevel@tonic-gate #define	STR	02	/* string value is valid */
130289Snakanon #define	DONTFREE 04	/* string space is not freeable */
1310Sstevel@tonic-gate #define	CON	010	/* this is a constant */
1320Sstevel@tonic-gate #define	ARR	020	/* this is an array */
1330Sstevel@tonic-gate #define	FCN	040	/* this is a function name */
134289Snakanon #define	FLD	0100	/* this is a field $1, $2, ... */
1350Sstevel@tonic-gate #define	REC	0200	/* this is $0 */
1360Sstevel@tonic-gate 
137289Snakanon #define	freeable(p)	(!((p)->tval & DONTFREE))
1380Sstevel@tonic-gate 
139289Snakanon extern Awkfloat setfval(Cell *, Awkfloat), getfval(Cell *), r_getfval(Cell *);
140289Snakanon extern uchar	*setsval(Cell *, uchar *), *getsval(Cell *), *r_getsval(Cell *);
141289Snakanon extern uchar	*tostring(uchar *), *tokname(int), *qstring(uchar *, int);
1420Sstevel@tonic-gate 
143289Snakanon #define	getfval(p)	\
144289Snakanon 	(((p)->tval & (ARR|FLD|REC|NUM)) == NUM ? (p)->fval : r_getfval(p))
145289Snakanon #define	getsval(p)	\
146289Snakanon 	(((p)->tval & (ARR|FLD|REC|STR)) == STR ? (p)->sval : r_getsval(p))
1470Sstevel@tonic-gate 
1480Sstevel@tonic-gate /* function types */
1490Sstevel@tonic-gate #define	FLENGTH	1
1500Sstevel@tonic-gate #define	FSQRT	2
1510Sstevel@tonic-gate #define	FEXP	3
1520Sstevel@tonic-gate #define	FLOG	4
1530Sstevel@tonic-gate #define	FINT	5
1540Sstevel@tonic-gate #define	FSYSTEM	6
1550Sstevel@tonic-gate #define	FRAND	7
1560Sstevel@tonic-gate #define	FSRAND	8
1570Sstevel@tonic-gate #define	FSIN	9
1580Sstevel@tonic-gate #define	FCOS	10
1590Sstevel@tonic-gate #define	FATAN	11
1600Sstevel@tonic-gate #define	FTOUPPER 12
1610Sstevel@tonic-gate #define	FTOLOWER 13
1620Sstevel@tonic-gate 
1630Sstevel@tonic-gate /* Node:  parse tree is made of nodes, with Cell's at bottom */
1640Sstevel@tonic-gate 
1650Sstevel@tonic-gate typedef struct Node {
1660Sstevel@tonic-gate 	int	ntype;
1670Sstevel@tonic-gate 	struct	Node *nnext;
1680Sstevel@tonic-gate 	off_t lineno;
1690Sstevel@tonic-gate 	int	nobj;
170289Snakanon 	struct Node *narg[1];
171289Snakanon 		/* variable: actual size set by calling malloc */
1720Sstevel@tonic-gate } Node;
1730Sstevel@tonic-gate 
174289Snakanon #define	NIL	((Node *)0)
1750Sstevel@tonic-gate 
1760Sstevel@tonic-gate extern Node	*winner;
1770Sstevel@tonic-gate extern Node	*nullstat;
1780Sstevel@tonic-gate extern Node	*nullnode;
1790Sstevel@tonic-gate 
1800Sstevel@tonic-gate /* ctypes */
181289Snakanon #define	OCELL	1
182289Snakanon #define	OBOOL	2
183289Snakanon #define	OJUMP	3
1840Sstevel@tonic-gate 
1850Sstevel@tonic-gate /* Cell subtypes: csub */
1860Sstevel@tonic-gate #define	CFREE	7
187289Snakanon #define	CCOPY	6
188289Snakanon #define	CCON	5
189289Snakanon #define	CTEMP	4
190289Snakanon #define	CNAME	3
191289Snakanon #define	CVAR	2
192289Snakanon #define	CFLD	1
1930Sstevel@tonic-gate 
1940Sstevel@tonic-gate /* bool subtypes */
195289Snakanon #define	BTRUE	11
196289Snakanon #define	BFALSE	12
1970Sstevel@tonic-gate 
1980Sstevel@tonic-gate /* jump subtypes */
199289Snakanon #define	JEXIT	21
200289Snakanon #define	JNEXT	22
2010Sstevel@tonic-gate #define	JBREAK	23
2020Sstevel@tonic-gate #define	JCONT	24
2030Sstevel@tonic-gate #define	JRET	25
2040Sstevel@tonic-gate 
2050Sstevel@tonic-gate /* node types */
206289Snakanon #define	NVALUE	1
207289Snakanon #define	NSTAT	2
208289Snakanon #define	NEXPR	3
2090Sstevel@tonic-gate #define	NFIELD	4
2100Sstevel@tonic-gate 
211289Snakanon extern	Cell	*(*proctab[])(Node **, int);
212289Snakanon extern	Cell	*nullproc(Node **, int);
2130Sstevel@tonic-gate extern	int	pairstack[], paircnt;
2140Sstevel@tonic-gate 
215289Snakanon extern	Node	*stat1(int, Node *), *stat2(int, Node *, Node *);
216289Snakanon extern	Node	*stat3(int, Node *, Node *, Node *);
217289Snakanon extern	Node	*stat4(int, Node *, Node *, Node *, Node *);
218289Snakanon extern	Node	*pa2stat(Node *, Node *, Node *);
219289Snakanon extern	Node	*op1(int, Node *), *op2(int, Node *, Node *);
220289Snakanon extern	Node	*op3(int, Node *, Node *, Node *);
221289Snakanon extern	Node	*op4(int, Node *, Node *, Node *, Node *);
222289Snakanon extern	Node	*linkum(Node *, Node *), *valtonode(Cell *, int);
223289Snakanon extern	Node	*rectonode(void), *exptostat(Node *);
224289Snakanon extern	Node	*makearr(Node *);
2250Sstevel@tonic-gate 
226289Snakanon #define	notlegal(n)	\
227289Snakanon 	(n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
228289Snakanon #define	isvalue(n)	((n)->ntype == NVALUE)
229289Snakanon #define	isexpr(n)	((n)->ntype == NEXPR)
230289Snakanon #define	isjump(n)	((n)->ctype == OJUMP)
231289Snakanon #define	isexit(n)	((n)->csub == JEXIT)
2320Sstevel@tonic-gate #define	isbreak(n)	((n)->csub == JBREAK)
2330Sstevel@tonic-gate #define	iscont(n)	((n)->csub == JCONT)
2340Sstevel@tonic-gate #define	isnext(n)	((n)->csub == JNEXT)
2350Sstevel@tonic-gate #define	isret(n)	((n)->csub == JRET)
236289Snakanon #define	isstr(n)	((n)->tval & STR)
237289Snakanon #define	isnum(n)	((n)->tval & NUM)
238289Snakanon #define	isarr(n)	((n)->tval & ARR)
239289Snakanon #define	isfunc(n)	((n)->tval & FCN)
240289Snakanon #define	istrue(n)	((n)->csub == BTRUE)
241289Snakanon #define	istemp(n)	((n)->csub == CTEMP)
2420Sstevel@tonic-gate 
243289Snakanon #define	NCHARS	(256+1)
244289Snakanon #define	NSTATES	32
2450Sstevel@tonic-gate 
2460Sstevel@tonic-gate typedef struct rrow {
2470Sstevel@tonic-gate 	int	ltype;
2480Sstevel@tonic-gate 	int	lval;
2490Sstevel@tonic-gate 	int	*lfollow;
2500Sstevel@tonic-gate } rrow;
2510Sstevel@tonic-gate 
2520Sstevel@tonic-gate typedef struct fa {
2530Sstevel@tonic-gate 	uchar	*restr;
2540Sstevel@tonic-gate 	int	anchor;
2550Sstevel@tonic-gate 	int	use;
2560Sstevel@tonic-gate 	uchar	gototab[NSTATES][NCHARS];
2570Sstevel@tonic-gate 	int	*posns[NSTATES];
2580Sstevel@tonic-gate 	uchar	out[NSTATES];
2590Sstevel@tonic-gate 	int	initstat;
2600Sstevel@tonic-gate 	int	curstat;
2610Sstevel@tonic-gate 	int	accept;
2620Sstevel@tonic-gate 	int	reset;
2630Sstevel@tonic-gate 	struct	rrow re[1];
2640Sstevel@tonic-gate } fa;
2650Sstevel@tonic-gate 
266289Snakanon /* b.c */
267289Snakanon extern	fa	*makedfa(uchar *, int);
268289Snakanon extern	int	nematch(fa *, uchar *);
269289Snakanon extern	int	match(fa *, uchar *);
270289Snakanon extern	int	pmatch(fa *, uchar *);
271289Snakanon 
272289Snakanon /* lib.c */
273289Snakanon extern	int	isclvar(uchar *);
274289Snakanon extern	int	is_number(uchar *);
275289Snakanon extern	void	setclvar(uchar *);
276289Snakanon extern	int	readrec(uchar **, size_t *, FILE *);
277289Snakanon extern	void	bracecheck(void);
278289Snakanon extern	void	syminit(void);
279289Snakanon extern	void	yyerror(char *);
280289Snakanon extern	void	fldbld(void);
281289Snakanon extern	void	recbld(void);
282289Snakanon extern	int	getrec(uchar **, size_t *);
283289Snakanon extern	Cell	*fieldadr(int);
284289Snakanon extern	void	newfld(int);
285289Snakanon extern	Cell	*getfld(int);
286289Snakanon extern	int	fldidx(Cell *);
287289Snakanon extern	double	errcheck(double, char *);
288289Snakanon extern	void	fpecatch(int);
289289Snakanon extern	void	init_buf(uchar **, size_t *, size_t);
290289Snakanon extern	void	adjust_buf(uchar **, size_t);
291289Snakanon extern	void	r_expand_buf(uchar **, size_t *, size_t);
292289Snakanon 
293289Snakanon extern	int	donefld;
294289Snakanon extern	int	donerec;
295289Snakanon extern	uchar	*record;
296289Snakanon extern	size_t	record_size;
297289Snakanon 
298289Snakanon /* main.c */
299289Snakanon extern	int	dbg;
300289Snakanon extern	uchar	*cmdname;
301289Snakanon extern	uchar	*lexprog;
302289Snakanon extern	int	compile_time;
303289Snakanon extern	char	radixpoint;
304289Snakanon 
305289Snakanon /* tran.c */
306289Snakanon extern	void	syminit(void);
307289Snakanon extern	void	arginit(int, uchar **);
308289Snakanon extern	void	envinit(uchar **);
309289Snakanon extern	void	freesymtab(Cell *);
310289Snakanon extern	void	freeelem(Cell *, uchar *);
311289Snakanon extern	void	funnyvar(Cell *, char *);
312289Snakanon extern	int	hash(uchar *, int);
313289Snakanon extern	Awkfloat *ARGC;
314289Snakanon 
315289Snakanon /* run.c */
316289Snakanon extern	void	run(Node *);
317289Snakanon 
318289Snakanon extern	int	paircnt;
319289Snakanon extern	Node	*winner;
320289Snakanon 
321289Snakanon #ifndef input
322289Snakanon extern	int	input(void);
323289Snakanon #endif
324289Snakanon extern	int	yyparse(void);
325289Snakanon extern	FILE	*yyin;
326289Snakanon extern	off_t	lineno;
327289Snakanon 
328289Snakanon /* proc */
329289Snakanon extern Cell *nullproc(Node **, int);
330289Snakanon extern Cell *program(Node **, int);
331289Snakanon extern Cell *boolop(Node **, int);
332289Snakanon extern Cell *relop(Node **, int);
333289Snakanon extern Cell *array(Node **, int);
334289Snakanon extern Cell *indirect(Node **, int);
335289Snakanon extern Cell *substr(Node **, int);
336289Snakanon extern Cell *sub(Node **, int);
337289Snakanon extern Cell *gsub(Node **, int);
338289Snakanon extern Cell *sindex(Node **, int);
3398546SRoger.Faulkner@Sun.COM extern Cell *a_sprintf(Node **, int);
340289Snakanon extern Cell *arith(Node **, int);
341289Snakanon extern Cell *incrdecr(Node **, int);
342289Snakanon extern Cell *cat(Node **, int);
343289Snakanon extern Cell *pastat(Node **, int);
344289Snakanon extern Cell *dopa2(Node **, int);
345289Snakanon extern Cell *matchop(Node **, int);
346289Snakanon extern Cell *intest(Node **, int);
347289Snakanon extern Cell *aprintf(Node **, int);
348289Snakanon extern Cell *print(Node **, int);
349289Snakanon extern Cell *closefile(Node **, int);
350289Snakanon extern Cell *delete(Node **, int);
351289Snakanon extern Cell *split(Node **, int);
352289Snakanon extern Cell *assign(Node **, int);
353289Snakanon extern Cell *condexpr(Node **, int);
354289Snakanon extern Cell *ifstat(Node **, int);
355289Snakanon extern Cell *whilestat(Node **, int);
356289Snakanon extern Cell *forstat(Node **, int);
357289Snakanon extern Cell *dostat(Node **, int);
358289Snakanon extern Cell *instat(Node **, int);
359289Snakanon extern Cell *jump(Node **, int);
360289Snakanon extern Cell *bltin(Node **, int);
361289Snakanon extern Cell *call(Node **, int);
362289Snakanon extern Cell *arg(Node **, int);
363289Snakanon extern Cell *getnf(Node **, int);
364*13093SRoger.Faulkner@Oracle.COM extern Cell *getaline(Node **, int);
365289Snakanon 
366289Snakanon #endif /* AWK_H */
367