1/****************************************************************
2Copyright (C) Lucent Technologies 1997
3All Rights Reserved
4
5Permission to use, copy, modify, and distribute this software and
6its documentation for any purpose and without fee is hereby
7granted, provided that the above copyright notice appear in all
8copies and that both that the copyright notice and this
9permission notice and warranty disclaimer appear in supporting
10documentation, and that the name Lucent Technologies or any of
11its entities not be used in advertising or publicity pertaining
12to distribution of the software without specific, written prior
13permission.
14
15LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
22THIS SOFTWARE.
23****************************************************************/
24
25extern	int	yywrap(void);
26extern	void	setfname(Cell *);
27extern	int	constnode(Node *);
28extern	char	*strnode(Node *);
29extern	Node	*notnull(Node *);
30extern	int	yyparse(void);
31
32extern	int	yylex(void);
33extern	void	startreg(void);
34extern	int	input(void);
35extern	void	unput(int);
36extern	void	unputstr(const char *);
37extern	int	yylook(void);
38extern	int	yyback(int *, int);
39extern	int	yyinput(void);
40
41extern	fa	*makedfa(const char *, bool);
42extern	fa	*mkdfa(const char *, bool);
43extern	int	makeinit(fa *, bool);
44extern	void	penter(Node *);
45extern	void	freetr(Node *);
46extern	int	quoted(const uschar **);
47extern	int	*cclenter(const char *);
48extern	noreturn void	overflo(const char *);
49extern	void	cfoll(fa *, Node *);
50extern	int	first(Node *);
51extern	void	follow(Node *);
52extern	int	member(int, int *);
53extern	int	match(fa *, const char *);
54extern	int	pmatch(fa *, const char *);
55extern	int	nematch(fa *, const char *);
56extern	bool	fnematch(fa *, FILE *, char **, int *, int);
57extern	Node	*reparse(const char *);
58extern	Node	*regexp(void);
59extern	Node	*primary(void);
60extern	Node	*concat(Node *);
61extern	Node	*alt(Node *);
62extern	Node	*unary(Node *);
63extern	int	relex(void);
64extern	int	cgoto(fa *, int, int);
65extern	void	freefa(fa *);
66
67extern	int	pgetc(void);
68extern	char	*cursource(void);
69
70extern	Node	*nodealloc(size_t);
71extern	Node	*exptostat(Node *);
72extern	Node	*node1(int, Node *);
73extern	Node	*node2(int, Node *, Node *);
74extern	Node	*node3(int, Node *, Node *, Node *);
75extern	Node	*node4(int, Node *, Node *, Node *, Node *);
76extern	Node	*node5(int, Node *, Node *, Node *, Node *, Node *);
77extern	Node	*stat3(int, Node *, Node *, Node *);
78extern	Node	*op2(int, Node *, Node *);
79extern	Node	*op1(int, Node *);
80extern	Node	*stat1(int, Node *);
81extern	Node	*op3(int, Node *, Node *, Node *);
82extern	Node	*op4(int, Node *, Node *, Node *, Node *);
83extern	Node	*op5(int, Node *, Node *, Node *, Node *, Node *);
84extern	Node	*stat2(int, Node *, Node *);
85extern	Node	*stat4(int, Node *, Node *, Node *, Node *);
86extern	Node	*celltonode(Cell *, int);
87extern	Node	*rectonode(void);
88extern	Node	*makearr(Node *);
89extern	Node	*pa2stat(Node *, Node *, Node *);
90extern	Node	*linkum(Node *, Node *);
91extern	void	defn(Cell *, Node *, Node *);
92extern	int	isarg(const char *);
93extern	const char *tokname(int);
94extern	Cell	*(*proctab[])(Node **, int);
95extern	int	ptoi(void *);
96extern	Node	*itonp(int);
97
98extern	void	syminit(void);
99extern	void	arginit(int, char **);
100extern	void	envinit(char **);
101extern	Array	*makesymtab(int);
102extern	void	freesymtab(Cell *);
103extern	void	freeelem(Cell *, const char *);
104extern	Cell	*setsymtab(const char *, const char *, double, unsigned int, Array *);
105extern	int	hash(const char *, int);
106extern	void	rehash(Array *);
107extern	Cell	*lookup(const char *, Array *);
108extern	double	setfval(Cell *, double);
109extern	void	funnyvar(Cell *, const char *);
110extern	char	*setsval(Cell *, const char *);
111extern	double	getfval(Cell *);
112extern	char	*getsval(Cell *);
113extern	char	*getpssval(Cell *);     /* for print */
114extern	char	*tostring(const char *);
115extern	char	*tostringN(const char *, size_t);
116extern	char	*qstring(const char *, int);
117extern	Cell	*catstr(Cell *, Cell *);
118
119extern	void	recinit(unsigned int);
120extern	void	initgetrec(void);
121extern	void	makefields(int, int);
122extern	void	growfldtab(int n);
123extern	void	savefs(void);
124extern	int	getrec(char **, int *, bool);
125extern	void	nextfile(void);
126extern	int	readrec(char **buf, int *bufsize, FILE *inf, bool isnew);
127extern	char	*getargv(int);
128extern	void	setclvar(char *);
129extern	void	fldbld(void);
130extern	void	cleanfld(int, int);
131extern	void	newfld(int);
132extern	void	setlastfld(int);
133extern	int	refldbld(const char *, const char *);
134extern	void	recbld(void);
135extern	Cell	*fieldadr(int);
136extern	void	yyerror(const char *);
137extern	void	bracecheck(void);
138extern	void	bcheck2(int, int, int);
139extern	void	SYNTAX(const char *, ...)
140    __attribute__((__format__(__printf__, 1, 2)));
141extern	noreturn void	FATAL(const char *, ...)
142    __attribute__((__format__(__printf__, 1, 2)));
143extern	void	WARNING(const char *, ...)
144    __attribute__((__format__(__printf__, 1, 2)));
145extern	void	error(void);
146extern	void	eprint(void);
147extern	void	bclass(int);
148extern	double	errcheck(double, const char *);
149extern	int	isclvar(const char *);
150extern	bool	is_valid_number(const char *s, bool trailing_stuff_ok,
151				bool *no_trailing, double *result);
152#define is_number(s, val)	is_valid_number(s, false, NULL, val)
153
154extern	int	adjbuf(char **pb, int *sz, int min, int q, char **pbp, const char *what);
155extern	void	run(Node *);
156extern	Cell	*execute(Node *);
157extern	Cell	*program(Node **, int);
158extern	Cell	*call(Node **, int);
159extern	Cell	*copycell(Cell *);
160extern	Cell	*arg(Node **, int);
161extern	Cell	*jump(Node **, int);
162extern	Cell	*awkgetline(Node **, int);
163extern	Cell	*getnf(Node **, int);
164extern	Cell	*array(Node **, int);
165extern	Cell	*awkdelete(Node **, int);
166extern	Cell	*intest(Node **, int);
167extern	Cell	*matchop(Node **, int);
168extern	Cell	*boolop(Node **, int);
169extern	Cell	*relop(Node **, int);
170extern	void	tfree(Cell *);
171extern	Cell	*gettemp(void);
172extern	Cell	*field(Node **, int);
173extern	Cell	*indirect(Node **, int);
174extern	Cell	*substr(Node **, int);
175extern	Cell	*sindex(Node **, int);
176extern	int	format(char **, int *, const char *, Node *);
177extern	Cell	*awksprintf(Node **, int);
178extern	Cell	*awkprintf(Node **, int);
179extern	Cell	*arith(Node **, int);
180extern	double	ipow(double, int);
181extern	Cell	*incrdecr(Node **, int);
182extern	Cell	*assign(Node **, int);
183extern	Cell	*cat(Node **, int);
184extern	Cell	*pastat(Node **, int);
185extern	Cell	*dopa2(Node **, int);
186extern	Cell	*split(Node **, int);
187extern	Cell	*condexpr(Node **, int);
188extern	Cell	*ifstat(Node **, int);
189extern	Cell	*whilestat(Node **, int);
190extern	Cell	*dostat(Node **, int);
191extern	Cell	*forstat(Node **, int);
192extern	Cell	*instat(Node **, int);
193extern	Cell	*bltin(Node **, int);
194extern	Cell	*printstat(Node **, int);
195extern	Cell	*nullproc(Node **, int);
196extern	FILE	*redirect(int, Node *);
197extern	FILE	*openfile(int, const char *, bool *);
198extern	const char	*filename(FILE *);
199extern	Cell	*closefile(Node **, int);
200extern	void	closeall(void);
201extern	Cell	*dosub(Node **, int);
202extern	Cell	*gensub(Node **, int);
203
204extern	FILE	*popen(const char *, const char *);
205extern	int	pclose(FILE *);
206
207extern  const char	*flags2str(int flags);
208