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