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