xref: /illumos-gate/usr/src/cmd/awk/awk.h (revision 3ee4fc2a)
1*3ee4fc2aSCody Peter Mello /*
2*3ee4fc2aSCody Peter Mello  * Copyright (C) Lucent Technologies 1997
3*3ee4fc2aSCody Peter Mello  * All Rights Reserved
4*3ee4fc2aSCody Peter Mello  *
5*3ee4fc2aSCody Peter Mello  * Permission to use, copy, modify, and distribute this software and
6*3ee4fc2aSCody Peter Mello  * its documentation for any purpose and without fee is hereby
7*3ee4fc2aSCody Peter Mello  * granted, provided that the above copyright notice appear in all
8*3ee4fc2aSCody Peter Mello  * copies and that both that the copyright notice and this
9*3ee4fc2aSCody Peter Mello  * permission notice and warranty disclaimer appear in supporting
10*3ee4fc2aSCody Peter Mello  * documentation, and that the name Lucent Technologies or any of
11*3ee4fc2aSCody Peter Mello  * its entities not be used in advertising or publicity pertaining
12*3ee4fc2aSCody Peter Mello  * to distribution of the software without specific, written prior
13*3ee4fc2aSCody Peter Mello  * permission.
14*3ee4fc2aSCody Peter Mello  *
15*3ee4fc2aSCody Peter Mello  * LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16*3ee4fc2aSCody Peter Mello  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17*3ee4fc2aSCody Peter Mello  * IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18*3ee4fc2aSCody Peter Mello  * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19*3ee4fc2aSCody Peter Mello  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20*3ee4fc2aSCody Peter Mello  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21*3ee4fc2aSCody Peter Mello  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
22*3ee4fc2aSCody Peter Mello  * THIS SOFTWARE.
23*3ee4fc2aSCody Peter Mello  */
24*3ee4fc2aSCody Peter Mello 
257c478bd9Sstevel@tonic-gate /*
267c478bd9Sstevel@tonic-gate  * CDDL HEADER START
277c478bd9Sstevel@tonic-gate  *
287c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
298ef4c21aSnakanon  * Common Development and Distribution License (the "License").
308ef4c21aSnakanon  * You may not use this file except in compliance with the License.
317c478bd9Sstevel@tonic-gate  *
327c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
337c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
347c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
357c478bd9Sstevel@tonic-gate  * and limitations under the License.
367c478bd9Sstevel@tonic-gate  *
377c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
387c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
397c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
407c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
417c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
427c478bd9Sstevel@tonic-gate  *
437c478bd9Sstevel@tonic-gate  * CDDL HEADER END
447c478bd9Sstevel@tonic-gate  */
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate /*
4723a1cceaSRoger A. Faulkner  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
487c478bd9Sstevel@tonic-gate  */
497c478bd9Sstevel@tonic-gate 
501ee2e5faSnakanon /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
511ee2e5faSnakanon /*	  All Rights Reserved  	*/
521ee2e5faSnakanon 
531ee2e5faSnakanon #ifndef AWK_H
541ee2e5faSnakanon #define	AWK_H
551ee2e5faSnakanon 
56*3ee4fc2aSCody Peter Mello #include <assert.h>
577c478bd9Sstevel@tonic-gate #include <sys/types.h>
581ee2e5faSnakanon #include <ctype.h>
591ee2e5faSnakanon #include <stdio.h>
601ee2e5faSnakanon #include <stdlib.h>
611ee2e5faSnakanon #include <string.h>
621ee2e5faSnakanon #include <libintl.h>
637c478bd9Sstevel@tonic-gate #include <limits.h>
647c478bd9Sstevel@tonic-gate 
657c478bd9Sstevel@tonic-gate typedef double	Awkfloat;
667c478bd9Sstevel@tonic-gate 
67*3ee4fc2aSCody Peter Mello /* unsigned char is more trouble than it's worth */
68*3ee4fc2aSCody Peter Mello 
69*3ee4fc2aSCody Peter Mello typedef	unsigned char uschar;
707c478bd9Sstevel@tonic-gate 
71*3ee4fc2aSCody Peter Mello #define	xfree(a)	{ if ((a) != NULL) { free((void *)(a)); (a) = NULL; } }
72*3ee4fc2aSCody Peter Mello 
73*3ee4fc2aSCody Peter Mello /* guaranteed non-null for dprintf */
74*3ee4fc2aSCody Peter Mello #define	NN(p)	((p) ? (p) : "(null)")
757c478bd9Sstevel@tonic-gate #define	DEBUG
767c478bd9Sstevel@tonic-gate #ifdef	DEBUG
777c478bd9Sstevel@tonic-gate 			/* uses have to be doubly parenthesized */
781ee2e5faSnakanon #define	dprintf(x)	if (dbg) (void) printf x
797c478bd9Sstevel@tonic-gate #else
801ee2e5faSnakanon #define	dprintf(x)
817c478bd9Sstevel@tonic-gate #endif
827c478bd9Sstevel@tonic-gate 
837c478bd9Sstevel@tonic-gate extern int	compile_time;	/* 1 if compiling, 0 if running */
84*3ee4fc2aSCody Peter Mello extern int	safe;		/* 0 => unsafe, 1 => safe */
857c478bd9Sstevel@tonic-gate 
861ee2e5faSnakanon #define	FLD_INCR	64
871ee2e5faSnakanon #define	LINE_INCR	256
88*3ee4fc2aSCody Peter Mello #define	RECSIZE	(8 * 1024)	/* sets limit on records, fields, etc., etc. */
89*3ee4fc2aSCody Peter Mello extern size_t	recsize;	/* size of current record, orig RECSIZE */
907c478bd9Sstevel@tonic-gate 
911ee2e5faSnakanon /* ensure that there is extra 1 byte in the buffer */
921ee2e5faSnakanon #define	expand_buf(p, n, r)	\
931ee2e5faSnakanon 	if (*(n) == 0 || (r) >= (*(n) - 1)) r_expand_buf(p, n, r)
947c478bd9Sstevel@tonic-gate 
95*3ee4fc2aSCody Peter Mello extern char	**FS;
96*3ee4fc2aSCody Peter Mello extern char	**RS;
97*3ee4fc2aSCody Peter Mello extern char	**ORS;
98*3ee4fc2aSCody Peter Mello extern char	**OFS;
99*3ee4fc2aSCody Peter Mello extern char	**OFMT;
1007c478bd9Sstevel@tonic-gate extern Awkfloat *NR;
1017c478bd9Sstevel@tonic-gate extern Awkfloat *FNR;
1027c478bd9Sstevel@tonic-gate extern Awkfloat *NF;
103*3ee4fc2aSCody Peter Mello extern char	**FILENAME;
104*3ee4fc2aSCody Peter Mello extern char	**SUBSEP;
1057c478bd9Sstevel@tonic-gate extern Awkfloat *RSTART;
1067c478bd9Sstevel@tonic-gate extern Awkfloat *RLENGTH;
1077c478bd9Sstevel@tonic-gate 
108*3ee4fc2aSCody Peter Mello extern char	*record;	/* points to $0 */
109*3ee4fc2aSCody Peter Mello extern size_t	recsize;
110*3ee4fc2aSCody Peter Mello extern int	errorflag;	/* 1 if error has occurred */
1117c478bd9Sstevel@tonic-gate extern int	donefld;	/* 1 if record broken into fields */
1127c478bd9Sstevel@tonic-gate extern int	donerec;	/* 1 if record is valid (no fld has changed */
1137c478bd9Sstevel@tonic-gate 
114*3ee4fc2aSCody Peter Mello extern	char	*patbeg;	/* beginning of pattern matched */
115*3ee4fc2aSCody Peter Mello extern	int	patlen;		/* length of pattern matched. set in b.c */
1167c478bd9Sstevel@tonic-gate 
1177c478bd9Sstevel@tonic-gate /* Cell:  all information about a variable or constant */
1187c478bd9Sstevel@tonic-gate 
1197c478bd9Sstevel@tonic-gate typedef struct Cell {
120*3ee4fc2aSCody Peter Mello 	uschar	ctype;		/* OCELL, OBOOL, OJUMP, etc. */
121*3ee4fc2aSCody Peter Mello 	uschar	csub;		/* CCON, CTEMP, CFLD, etc. */
122*3ee4fc2aSCody Peter Mello 	char	*nval;		/* name, for variables only */
123*3ee4fc2aSCody Peter Mello 	char	*sval;		/* string value */
1247c478bd9Sstevel@tonic-gate 	Awkfloat fval;		/* value as number */
125*3ee4fc2aSCody Peter Mello 	int	 tval;
126*3ee4fc2aSCody Peter Mello 		/* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE|CONVC|CONVO */
127*3ee4fc2aSCody Peter Mello 	char	*fmt;
128*3ee4fc2aSCody Peter Mello 		/* CONVFMT/OFMT value used to convert from number */
1297c478bd9Sstevel@tonic-gate 	struct Cell *cnext;	/* ptr to next if chained */
1307c478bd9Sstevel@tonic-gate } Cell;
1317c478bd9Sstevel@tonic-gate 
132*3ee4fc2aSCody Peter Mello typedef struct Array {		/* symbol table array */
1337c478bd9Sstevel@tonic-gate 	int	nelem;		/* elements in table right now */
1347c478bd9Sstevel@tonic-gate 	int	size;		/* size of tab */
1357c478bd9Sstevel@tonic-gate 	Cell	**tab;		/* hash table pointers */
1367c478bd9Sstevel@tonic-gate } Array;
1377c478bd9Sstevel@tonic-gate 
1387c478bd9Sstevel@tonic-gate #define	NSYMTAB	50	/* initial size of a symbol table */
1391ee2e5faSnakanon extern Array	*symtab, *makesymtab(int);
140*3ee4fc2aSCody Peter Mello extern Cell	*setsymtab(const char *, const char *, Awkfloat,
141*3ee4fc2aSCody Peter Mello 		    unsigned int, Array *);
142*3ee4fc2aSCody Peter Mello extern Cell	*lookup(const char *, Array *);
1437c478bd9Sstevel@tonic-gate 
1447c478bd9Sstevel@tonic-gate extern Cell	*recloc;	/* location of input record */
1457c478bd9Sstevel@tonic-gate extern Cell	*nrloc;		/* NR */
1467c478bd9Sstevel@tonic-gate extern Cell	*fnrloc;	/* FNR */
147*3ee4fc2aSCody Peter Mello extern Cell	*fsloc;		/* FS */
1487c478bd9Sstevel@tonic-gate extern Cell	*nfloc;		/* NF */
149*3ee4fc2aSCody Peter Mello extern Cell	*ofsloc;	/* OFS */
150*3ee4fc2aSCody Peter Mello extern Cell	*orsloc;	/* ORS */
151*3ee4fc2aSCody Peter Mello extern Cell	*rsloc;		/* RS */
152*3ee4fc2aSCody Peter Mello extern Cell	*rtloc;		/* RT */
1537c478bd9Sstevel@tonic-gate extern Cell	*rstartloc;	/* RSTART */
1547c478bd9Sstevel@tonic-gate extern Cell	*rlengthloc;	/* RLENGTH */
155*3ee4fc2aSCody Peter Mello extern Cell	*subseploc;	/* SUBSEP */
156*3ee4fc2aSCody Peter Mello extern Cell	*symtabloc;	/* SYMTAB */
1577c478bd9Sstevel@tonic-gate 
1587c478bd9Sstevel@tonic-gate /* Cell.tval values: */
1597c478bd9Sstevel@tonic-gate #define	NUM	01	/* number value is valid */
1607c478bd9Sstevel@tonic-gate #define	STR	02	/* string value is valid */
1611ee2e5faSnakanon #define	DONTFREE 04	/* string space is not freeable */
1627c478bd9Sstevel@tonic-gate #define	CON	010	/* this is a constant */
1637c478bd9Sstevel@tonic-gate #define	ARR	020	/* this is an array */
1647c478bd9Sstevel@tonic-gate #define	FCN	040	/* this is a function name */
1651ee2e5faSnakanon #define	FLD	0100	/* this is a field $1, $2, ... */
1667c478bd9Sstevel@tonic-gate #define	REC	0200	/* this is $0 */
167*3ee4fc2aSCody Peter Mello #define	CONVC	0400	/* string was converted from number via CONVFMT */
168*3ee4fc2aSCody Peter Mello #define	CONVO	01000	/* string was converted from number via OFMT */
1697c478bd9Sstevel@tonic-gate 
1707c478bd9Sstevel@tonic-gate 
171*3ee4fc2aSCody Peter Mello extern Awkfloat	setfval(Cell *, Awkfloat);
172*3ee4fc2aSCody Peter Mello extern Awkfloat	getfval(Cell *);
173*3ee4fc2aSCody Peter Mello extern char	*setsval(Cell *, const char *);
174*3ee4fc2aSCody Peter Mello extern char	*getsval(Cell *);
175*3ee4fc2aSCody Peter Mello extern char	*getpssval(Cell *);	/* for print */
176*3ee4fc2aSCody Peter Mello extern char	*tostring(const char *);
177*3ee4fc2aSCody Peter Mello extern char	*tokname(int);
178*3ee4fc2aSCody Peter Mello extern char	*qstring(const char *, int);
1797c478bd9Sstevel@tonic-gate 
1807c478bd9Sstevel@tonic-gate /* function types */
1817c478bd9Sstevel@tonic-gate #define	FLENGTH	1
1827c478bd9Sstevel@tonic-gate #define	FSQRT	2
1837c478bd9Sstevel@tonic-gate #define	FEXP	3
1847c478bd9Sstevel@tonic-gate #define	FLOG	4
1857c478bd9Sstevel@tonic-gate #define	FINT	5
1867c478bd9Sstevel@tonic-gate #define	FSYSTEM	6
1877c478bd9Sstevel@tonic-gate #define	FRAND	7
1887c478bd9Sstevel@tonic-gate #define	FSRAND	8
1897c478bd9Sstevel@tonic-gate #define	FSIN	9
1907c478bd9Sstevel@tonic-gate #define	FCOS	10
1917c478bd9Sstevel@tonic-gate #define	FATAN	11
1927c478bd9Sstevel@tonic-gate #define	FTOUPPER 12
1937c478bd9Sstevel@tonic-gate #define	FTOLOWER 13
194*3ee4fc2aSCody Peter Mello #define	FFLUSH	14
1957c478bd9Sstevel@tonic-gate 
1967c478bd9Sstevel@tonic-gate /* Node:  parse tree is made of nodes, with Cell's at bottom */
1977c478bd9Sstevel@tonic-gate 
1987c478bd9Sstevel@tonic-gate typedef struct Node {
1997c478bd9Sstevel@tonic-gate 	int	ntype;
2007c478bd9Sstevel@tonic-gate 	struct	Node *nnext;
201*3ee4fc2aSCody Peter Mello 	off_t	lineno;
2027c478bd9Sstevel@tonic-gate 	int	nobj;
203*3ee4fc2aSCody Peter Mello 	struct	Node *narg[1];
2041ee2e5faSnakanon 		/* variable: actual size set by calling malloc */
2057c478bd9Sstevel@tonic-gate } Node;
2067c478bd9Sstevel@tonic-gate 
2071ee2e5faSnakanon #define	NIL	((Node *)0)
2087c478bd9Sstevel@tonic-gate 
2097c478bd9Sstevel@tonic-gate extern Node	*winner;
2107c478bd9Sstevel@tonic-gate extern Node	*nullstat;
2117c478bd9Sstevel@tonic-gate extern Node	*nullnode;
2127c478bd9Sstevel@tonic-gate 
2137c478bd9Sstevel@tonic-gate /* ctypes */
2141ee2e5faSnakanon #define	OCELL	1
2151ee2e5faSnakanon #define	OBOOL	2
2161ee2e5faSnakanon #define	OJUMP	3
2177c478bd9Sstevel@tonic-gate 
2187c478bd9Sstevel@tonic-gate /* Cell subtypes: csub */
2197c478bd9Sstevel@tonic-gate #define	CFREE	7
2201ee2e5faSnakanon #define	CCOPY	6
2211ee2e5faSnakanon #define	CCON	5
2221ee2e5faSnakanon #define	CTEMP	4
2231ee2e5faSnakanon #define	CNAME	3
2241ee2e5faSnakanon #define	CVAR	2
2251ee2e5faSnakanon #define	CFLD	1
226*3ee4fc2aSCody Peter Mello #define	CUNK	0
2277c478bd9Sstevel@tonic-gate 
2287c478bd9Sstevel@tonic-gate /* bool subtypes */
2291ee2e5faSnakanon #define	BTRUE	11
2301ee2e5faSnakanon #define	BFALSE	12
2317c478bd9Sstevel@tonic-gate 
2327c478bd9Sstevel@tonic-gate /* jump subtypes */
2331ee2e5faSnakanon #define	JEXIT	21
2341ee2e5faSnakanon #define	JNEXT	22
2357c478bd9Sstevel@tonic-gate #define	JBREAK	23
2367c478bd9Sstevel@tonic-gate #define	JCONT	24
2377c478bd9Sstevel@tonic-gate #define	JRET	25
238*3ee4fc2aSCody Peter Mello #define	JNEXTFILE	26
2397c478bd9Sstevel@tonic-gate 
2407c478bd9Sstevel@tonic-gate /* node types */
2411ee2e5faSnakanon #define	NVALUE	1
2421ee2e5faSnakanon #define	NSTAT	2
2431ee2e5faSnakanon #define	NEXPR	3
2447c478bd9Sstevel@tonic-gate #define	NFIELD	4
2457c478bd9Sstevel@tonic-gate 
2461ee2e5faSnakanon extern	Cell	*(*proctab[])(Node **, int);
2471ee2e5faSnakanon extern	Cell	*nullproc(Node **, int);
248*3ee4fc2aSCody Peter Mello extern	int	*pairstack, paircnt;
2491ee2e5faSnakanon 
2501ee2e5faSnakanon extern	Node	*stat1(int, Node *), *stat2(int, Node *, Node *);
2511ee2e5faSnakanon extern	Node	*stat3(int, Node *, Node *, Node *);
2521ee2e5faSnakanon extern	Node	*stat4(int, Node *, Node *, Node *, Node *);
2531ee2e5faSnakanon extern	Node	*pa2stat(Node *, Node *, Node *);
2541ee2e5faSnakanon extern	Node	*op1(int, Node *), *op2(int, Node *, Node *);
2551ee2e5faSnakanon extern	Node	*op3(int, Node *, Node *, Node *);
2561ee2e5faSnakanon extern	Node	*op4(int, Node *, Node *, Node *, Node *);
257*3ee4fc2aSCody Peter Mello extern	Node	*linkum(Node *, Node *), *celltonode(Cell *, int);
2581ee2e5faSnakanon extern	Node	*rectonode(void), *exptostat(Node *);
2591ee2e5faSnakanon extern	Node	*makearr(Node *);
2601ee2e5faSnakanon 
2611ee2e5faSnakanon #define	notlegal(n)	\
2621ee2e5faSnakanon 	(n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
2631ee2e5faSnakanon #define	isvalue(n)	((n)->ntype == NVALUE)
2641ee2e5faSnakanon #define	isexpr(n)	((n)->ntype == NEXPR)
2651ee2e5faSnakanon #define	isjump(n)	((n)->ctype == OJUMP)
2661ee2e5faSnakanon #define	isexit(n)	((n)->csub == JEXIT)
2677c478bd9Sstevel@tonic-gate #define	isbreak(n)	((n)->csub == JBREAK)
2687c478bd9Sstevel@tonic-gate #define	iscont(n)	((n)->csub == JCONT)
269*3ee4fc2aSCody Peter Mello #define	isnext(n)	((n)->csub == JNEXT || (n)->csub == JNEXTFILE)
2707c478bd9Sstevel@tonic-gate #define	isret(n)	((n)->csub == JRET)
271*3ee4fc2aSCody Peter Mello #define	isrec(n)	((n)->tval & REC)
272*3ee4fc2aSCody Peter Mello #define	isfld(n)	((n)->tval & FLD)
2731ee2e5faSnakanon #define	isstr(n)	((n)->tval & STR)
2741ee2e5faSnakanon #define	isnum(n)	((n)->tval & NUM)
2751ee2e5faSnakanon #define	isarr(n)	((n)->tval & ARR)
276*3ee4fc2aSCody Peter Mello #define	isfcn(n)	((n)->tval & FCN)
2771ee2e5faSnakanon #define	istrue(n)	((n)->csub == BTRUE)
2781ee2e5faSnakanon #define	istemp(n)	((n)->csub == CTEMP)
279*3ee4fc2aSCody Peter Mello #define	freeable(p)	(((p)->tval & (STR|DONTFREE)) == STR)
280*3ee4fc2aSCody Peter Mello 
281*3ee4fc2aSCody Peter Mello /* structures used by regular expression matching machinery, mostly b.c: */
2827c478bd9Sstevel@tonic-gate 
283*3ee4fc2aSCody Peter Mello /* 256 handles 8-bit chars; 128 does 7-bit */
284*3ee4fc2aSCody Peter Mello /* watch out in match(), etc. */
285*3ee4fc2aSCody Peter Mello #define	NCHARS	(256+3)
2861ee2e5faSnakanon #define	NSTATES	32
2877c478bd9Sstevel@tonic-gate 
2887c478bd9Sstevel@tonic-gate typedef struct rrow {
289*3ee4fc2aSCody Peter Mello 	long	ltype;	/* long avoids pointer warnings on 64-bit */
290*3ee4fc2aSCody Peter Mello 	union {
291*3ee4fc2aSCody Peter Mello 		int i;
292*3ee4fc2aSCody Peter Mello 		Node *np;
293*3ee4fc2aSCody Peter Mello 		uschar *up;
294*3ee4fc2aSCody Peter Mello 	} lval;		/* because Al stores a pointer in it! */
2957c478bd9Sstevel@tonic-gate 	int	*lfollow;
2967c478bd9Sstevel@tonic-gate } rrow;
2977c478bd9Sstevel@tonic-gate 
2987c478bd9Sstevel@tonic-gate typedef struct fa {
299*3ee4fc2aSCody Peter Mello 	uschar	gototab[NSTATES][NCHARS];
300*3ee4fc2aSCody Peter Mello 	uschar	out[NSTATES];
301*3ee4fc2aSCody Peter Mello 	uschar	*restr;
302*3ee4fc2aSCody Peter Mello 	int	*posns[NSTATES];
3037c478bd9Sstevel@tonic-gate 	int	anchor;
3047c478bd9Sstevel@tonic-gate 	int	use;
3057c478bd9Sstevel@tonic-gate 	int	initstat;
3067c478bd9Sstevel@tonic-gate 	int	curstat;
3077c478bd9Sstevel@tonic-gate 	int	accept;
3087c478bd9Sstevel@tonic-gate 	int	reset;
309*3ee4fc2aSCody Peter Mello 	/* re is variable: actual size set by calling malloc */
3107c478bd9Sstevel@tonic-gate 	struct	rrow re[1];
3117c478bd9Sstevel@tonic-gate } fa;
3127c478bd9Sstevel@tonic-gate 
313*3ee4fc2aSCody Peter Mello /* lex.c */
314*3ee4fc2aSCody Peter Mello extern	int	yylex(void);
315*3ee4fc2aSCody Peter Mello extern	void	startreg(void);
316*3ee4fc2aSCody Peter Mello extern	int	input(void);
317*3ee4fc2aSCody Peter Mello extern	void	unput(int);
318*3ee4fc2aSCody Peter Mello extern	void	unputstr(const char *);
319*3ee4fc2aSCody Peter Mello extern	int	yylook(void);
320*3ee4fc2aSCody Peter Mello extern	int	yyback(int *, int);
321*3ee4fc2aSCody Peter Mello extern	int	yyinput(void);
322*3ee4fc2aSCody Peter Mello 
323*3ee4fc2aSCody Peter Mello /* parse.c */
324*3ee4fc2aSCody Peter Mello extern	void	defn(Cell *, Node *, Node *);
325*3ee4fc2aSCody Peter Mello extern	int	ptoi(void *);
326*3ee4fc2aSCody Peter Mello extern	Node	*itonp(int);
327*3ee4fc2aSCody Peter Mello extern	int	isarg(const char *);
328*3ee4fc2aSCody Peter Mello 
3291ee2e5faSnakanon /* b.c */
330*3ee4fc2aSCody Peter Mello extern	fa	*makedfa(const char *, int);
331*3ee4fc2aSCody Peter Mello extern	int	nematch(fa *, const char *);
332*3ee4fc2aSCody Peter Mello extern	int	match(fa *, const char *);
333*3ee4fc2aSCody Peter Mello extern	int	pmatch(fa *, const char *);
3341ee2e5faSnakanon 
3351ee2e5faSnakanon /* lib.c */
336*3ee4fc2aSCody Peter Mello 
337*3ee4fc2aSCody Peter Mello extern	void	SYNTAX(const char *, ...);
338*3ee4fc2aSCody Peter Mello extern	void	FATAL(const char *, ...) __attribute__((__noreturn__));
339*3ee4fc2aSCody Peter Mello extern	void	WARNING(const char *, ...);
340*3ee4fc2aSCody Peter Mello extern	void	error(void);
341*3ee4fc2aSCody Peter Mello extern	void	nextfile(void);
342*3ee4fc2aSCody Peter Mello extern	void	savefs(void);
343*3ee4fc2aSCody Peter Mello 
344*3ee4fc2aSCody Peter Mello extern	int	isclvar(const char *);
345*3ee4fc2aSCody Peter Mello extern	int	is_number(const char *);
346*3ee4fc2aSCody Peter Mello extern	void	setclvar(char *);
347*3ee4fc2aSCody Peter Mello extern	int	readrec(char **, size_t *, FILE *);
3481ee2e5faSnakanon extern	void	bracecheck(void);
349*3ee4fc2aSCody Peter Mello extern	void	recinit(unsigned int n);
3501ee2e5faSnakanon extern	void	syminit(void);
351*3ee4fc2aSCody Peter Mello extern	void	yyerror(const char *);
3521ee2e5faSnakanon extern	void	fldbld(void);
3531ee2e5faSnakanon extern	void	recbld(void);
354*3ee4fc2aSCody Peter Mello extern	int	getrec(char **, size_t *, int);
3551ee2e5faSnakanon extern	Cell	*fieldadr(int);
3561ee2e5faSnakanon extern	void	newfld(int);
3571ee2e5faSnakanon extern	int	fldidx(Cell *);
358*3ee4fc2aSCody Peter Mello extern	double	errcheck(double, const char *);
3591ee2e5faSnakanon extern	void	fpecatch(int);
360*3ee4fc2aSCody Peter Mello extern	void	r_expand_buf(char **, size_t *, size_t);
361*3ee4fc2aSCody Peter Mello extern	void	makefields(int, int);
362*3ee4fc2aSCody Peter Mello extern	void	growfldtab(int n);
363*3ee4fc2aSCody Peter Mello extern	void	setlastfld(int n);
3641ee2e5faSnakanon 
3651ee2e5faSnakanon /* main.c */
3661ee2e5faSnakanon extern	int	dbg;
367*3ee4fc2aSCody Peter Mello extern	char	*lexprog;
3681ee2e5faSnakanon extern	int	compile_time;
369*3ee4fc2aSCody Peter Mello extern	char	*cursource(void);
370*3ee4fc2aSCody Peter Mello extern	int	pgetc(void);
3711ee2e5faSnakanon 
3721ee2e5faSnakanon /* tran.c */
3731ee2e5faSnakanon extern	void	syminit(void);
374*3ee4fc2aSCody Peter Mello extern	void	arginit(int, char **);
375*3ee4fc2aSCody Peter Mello extern	void	envinit(char **);
3761ee2e5faSnakanon extern	void	freesymtab(Cell *);
377*3ee4fc2aSCody Peter Mello extern	void	freeelem(Cell *, const char *);
378*3ee4fc2aSCody Peter Mello extern	void	funnyvar(Cell *, const char *);
379*3ee4fc2aSCody Peter Mello extern	int	hash(const char *, int);
3801ee2e5faSnakanon extern	Awkfloat *ARGC;
3811ee2e5faSnakanon 
3821ee2e5faSnakanon /* run.c */
383*3ee4fc2aSCody Peter Mello extern	void		run(Node *);
384*3ee4fc2aSCody Peter Mello extern	const char	*filename(FILE *);
385*3ee4fc2aSCody Peter Mello extern	int		adjbuf(char **pb, size_t *sz, size_t min, size_t q,
386*3ee4fc2aSCody Peter Mello 			    char **pbp, const char *what);
3871ee2e5faSnakanon 
3881ee2e5faSnakanon extern	int	paircnt;
3891ee2e5faSnakanon extern	Node	*winner;
3901ee2e5faSnakanon 
3911ee2e5faSnakanon #ifndef input
3921ee2e5faSnakanon extern	int	input(void);
3931ee2e5faSnakanon #endif
3941ee2e5faSnakanon extern	int	yyparse(void);
3951ee2e5faSnakanon extern	FILE	*yyin;
3961ee2e5faSnakanon extern	off_t	lineno;
3971ee2e5faSnakanon 
3981ee2e5faSnakanon /* proc */
3991ee2e5faSnakanon extern Cell *nullproc(Node **, int);
4001ee2e5faSnakanon extern Cell *program(Node **, int);
4011ee2e5faSnakanon extern Cell *boolop(Node **, int);
4021ee2e5faSnakanon extern Cell *relop(Node **, int);
4031ee2e5faSnakanon extern Cell *array(Node **, int);
4041ee2e5faSnakanon extern Cell *indirect(Node **, int);
4051ee2e5faSnakanon extern Cell *substr(Node **, int);
4061ee2e5faSnakanon extern Cell *sub(Node **, int);
4071ee2e5faSnakanon extern Cell *gsub(Node **, int);
4081ee2e5faSnakanon extern Cell *sindex(Node **, int);
409*3ee4fc2aSCody Peter Mello extern Cell *awksprintf(Node **, int);
4101ee2e5faSnakanon extern Cell *arith(Node **, int);
4111ee2e5faSnakanon extern Cell *incrdecr(Node **, int);
4121ee2e5faSnakanon extern Cell *cat(Node **, int);
4131ee2e5faSnakanon extern Cell *pastat(Node **, int);
4141ee2e5faSnakanon extern Cell *dopa2(Node **, int);
4151ee2e5faSnakanon extern Cell *matchop(Node **, int);
4161ee2e5faSnakanon extern Cell *intest(Node **, int);
417*3ee4fc2aSCody Peter Mello extern Cell *awkprintf(Node **, int);
418*3ee4fc2aSCody Peter Mello extern Cell *printstat(Node **, int);
4191ee2e5faSnakanon extern Cell *closefile(Node **, int);
420*3ee4fc2aSCody Peter Mello extern Cell *awkdelete(Node **, int);
4211ee2e5faSnakanon extern Cell *split(Node **, int);
4221ee2e5faSnakanon extern Cell *assign(Node **, int);
4231ee2e5faSnakanon extern Cell *condexpr(Node **, int);
4241ee2e5faSnakanon extern Cell *ifstat(Node **, int);
4251ee2e5faSnakanon extern Cell *whilestat(Node **, int);
4261ee2e5faSnakanon extern Cell *forstat(Node **, int);
4271ee2e5faSnakanon extern Cell *dostat(Node **, int);
4281ee2e5faSnakanon extern Cell *instat(Node **, int);
4291ee2e5faSnakanon extern Cell *jump(Node **, int);
4301ee2e5faSnakanon extern Cell *bltin(Node **, int);
4311ee2e5faSnakanon extern Cell *call(Node **, int);
4321ee2e5faSnakanon extern Cell *arg(Node **, int);
4331ee2e5faSnakanon extern Cell *getnf(Node **, int);
434*3ee4fc2aSCody Peter Mello extern Cell *awkgetline(Node **, int);
4351ee2e5faSnakanon 
4361ee2e5faSnakanon #endif /* AWK_H */
437