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