1/*- 2 * Copyright (c) 1991 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8#ifndef lint 9static char sccsid[] = "@(#)awk.def 4.5 (Berkeley) 04/17/91"; 10#endif /* not lint */ 11 12#include <stdlib.h> 13 14#define hack int 15#define AWKFLOAT float 16#define xfree(a) { if(a!=NULL) { yfree(a); a=NULL;} } 17#define strfree(a) { if(a!=NULL && a!=EMPTY) { yfree(a);} a=EMPTY; } 18#define yfree free 19#define isnull(x) ((x) == EMPTY || (x) == NULL) 20 21#ifdef DEBUG 22# define dprintf if(dbg)printf 23#else 24# define dprintf(x1, x2, x3, x4) 25#endif 26typedef AWKFLOAT awkfloat; 27 28extern char **FS; 29extern char **RS; 30extern char **ORS; 31extern char **OFS; 32extern char **OFMT; 33extern awkfloat *NR; 34extern awkfloat *NF; 35extern char **FILENAME; 36 37extern char record[]; 38extern char EMPTY[]; 39extern int dbg; 40extern int lineno; 41extern int errorflag; 42extern int donefld; /* 1 if record broken into fields */ 43extern int donerec; /* 1 if record is valid (no fld has changed */ 44 45typedef struct val { /* general value during processing */ 46 char *nval; /* name, for variables only */ 47 char *sval; /* string value */ 48 awkfloat fval; /* value as number */ 49 unsigned tval; /* type info */ 50 struct val *nextval; /* ptr to next if chained */ 51} cell; 52extern cell *symtab[]; 53cell *setsymtab(), *lookup(), **makesymtab(); 54 55extern cell *recloc; /* location of input record */ 56extern cell *nrloc; /* NR */ 57extern cell *nfloc; /* NF */ 58 59#define STR 01 /* string value is valid */ 60#define NUM 02 /* number value is valid */ 61#define FLD 04 /* FLD means don't free string space */ 62#define CON 010 /* this is a constant */ 63#define ARR 020 /* this is an array */ 64 65awkfloat setfval(), getfval(); 66char *setsval(), *getsval(); 67char *tostring(), *tokname(); 68double log(), sqrt(), exp(), atof(); 69 70/* function types */ 71#define FLENGTH 1 72#define FSQRT 2 73#define FEXP 3 74#define FLOG 4 75#define FINT 5 76 77typedef struct { 78 char otype; 79 char osub; 80 cell *optr; 81} obj; 82 83#define BOTCH 1 84struct nd { 85 char ntype; 86 char subtype; 87 struct nd *nnext; 88 int nobj; 89 struct nd *narg[BOTCH]; /* C won't take a zero length array */ 90}; 91typedef struct nd node; 92extern node *winner; 93extern node *nullstat; 94 95/* otypes */ 96#define OCELL 0 97#define OEXPR 1 98#define OBOOL 2 99#define OJUMP 3 100 101/* cell subtypes */ 102#define CTEMP 4 103#define CNAME 3 104#define CVAR 2 105#define CFLD 1 106#define CCON 0 107 108/* bool subtypes */ 109#define BTRUE 1 110#define BFALSE 2 111 112/* jump subtypes */ 113#define JEXIT 1 114#define JNEXT 2 115#define JBREAK 3 116#define JCONT 4 117 118/* node types */ 119#define NVALUE 1 120#define NSTAT 2 121#define NEXPR 3 122#define NPA2 4 123 124extern obj (*proctab[])(); 125extern obj true, false; 126extern int pairstack[], paircnt; 127 128#define cantexec(n) (n->ntype == NVALUE) 129#define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN]== nullproc) 130#define isexpr(n) (n->ntype == NEXPR) 131#define isjump(n) (n.otype == OJUMP) 132#define isexit(n) (n.otype == OJUMP && n.osub == JEXIT) 133#define isbreak(n) (n.otype == OJUMP && n.osub == JBREAK) 134#define iscont(n) (n.otype == OJUMP && n.osub == JCONT) 135#define isnext(n) (n.otype == OJUMP && n.osub == JNEXT) 136#define isstr(n) (n.optr->tval & STR) 137#define istrue(n) (n.otype == OBOOL && n.osub == BTRUE) 138#define istemp(n) (n.otype == OCELL && n.osub == CTEMP) 139#define isfld(n) (!donefld && n.osub==CFLD && n.otype==OCELL && n.optr->nval==EMPTY) 140#define isrec(n) (donefld && n.osub==CFLD && n.otype==OCELL && n.optr->nval!=EMPTY) 141obj nullproc(); 142obj relop(); 143 144#define MAXSYM 50 145#define HAT 0177 /* matches ^ in regular expr */ 146 /* watch out for mach dep */ 147