xref: /csrg-svn/old/awk/awk.def (revision 48236)
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