]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/awk/awk.h
merge
[plan9front.git] / sys / src / cmd / awk / awk.h
1 /*
2 Copyright (c) Lucent Technologies 1997
3         All Rights Reserved
4
5 */
6
7 typedef double  Awkfloat;
8
9 #define xfree(a)        { if ((a) != nil) { free((a)); (a) = nil; } }
10
11 #define DEBUG
12 #ifdef  DEBUG
13                         /* uses have to be doubly parenthesized */
14 #       define  dprint(x)       if (dbg) print x
15 #else
16 #       define  dprint(x)
17 #endif
18
19 #define FOPEN_MAX       40      /* max number of open files */
20
21 extern  char    errbuf[];
22
23 extern int      compile_time;   /* 1 if compiling, 0 if running */
24 extern int      safe;           /* 0 => unsafe, 1 => safe */
25
26 #define RECSIZE (8 * 1024)      /* sets limit on records, fields, etc., etc. */
27 extern int      recsize;        /* size of current record, orig RECSIZE */
28
29 extern Biobuf stdin;
30 extern Biobuf stdout;
31 extern Biobuf stderr;
32
33 extern char     **FS;
34 extern char     **RS;
35 extern char     **ORS;
36 extern char     **OFS;
37 extern char     **OFMT;
38 extern Awkfloat *NR;
39 extern Awkfloat *FNR;
40 extern Awkfloat *NF;
41 extern char     **FILENAME;
42 extern char     **SUBSEP;
43 extern Awkfloat *RSTART;
44 extern Awkfloat *RLENGTH;
45
46 extern char     *record;        /* points to $0 */
47 extern int      lineno;         /* line number in awk program */
48 extern int      errorflag;      /* 1 if error has occurred */
49 extern int      donefld;        /* 1 if record broken into fields */
50 extern int      donerec;        /* 1 if record is valid (no fld has changed */
51 extern char     inputFS[];      /* FS at time of input, for field splitting */
52
53 extern int      dbg;
54
55 extern  char    *patbeg;        /* beginning of pattern matched */
56 extern  int     patlen;         /* length of pattern matched.  set in b.c */
57
58 /* Cell:  all information about a variable or constant */
59
60 typedef struct Cell {
61         uchar   ctype;          /* OCELL, OBOOL, OJUMP, etc. */
62         uchar   csub;           /* CCON, CTEMP, CFLD, etc. */
63         char    *nval;          /* name, for variables only */
64         char    *sval;          /* string value */
65         Awkfloat fval;          /* value as number */
66         int      tval;          /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
67         struct Cell *cnext;     /* ptr to next if chained */
68 } Cell;
69
70 typedef struct Array {          /* symbol table array */
71         int     nelemt;         /* elements in table right now */
72         int     size;           /* size of tab */
73         Cell    **tab;          /* hash table pointers */
74 } Array;
75
76 #define NSYMTAB 50      /* initial size of a symbol table */
77 extern Array    *symtab;
78
79 extern Cell     *nrloc;         /* NR */
80 extern Cell     *fnrloc;        /* FNR */
81 extern Cell     *nfloc;         /* NF */
82 extern Cell     *rstartloc;     /* RSTART */
83 extern Cell     *rlengthloc;    /* RLENGTH */
84
85 /* Cell.tval values: */
86 #define NUM     01      /* number value is valid */
87 #define STR     02      /* string value is valid */
88 #define DONTFREE 04     /* string space is not freeable */
89 #define CON     010     /* this is a constant */
90 #define ARR     020     /* this is an array */
91 #define FCN     040     /* this is a function name */
92 #define FLD     0100    /* this is a field $1, $2, ... */
93 #define REC     0200    /* this is $0 */
94
95
96 /* function types */
97 #define FLENGTH 1
98 #define FSQRT   2
99 #define FEXP    3
100 #define FLOG    4
101 #define FINT    5
102 #define FSYSTEM 6
103 #define FRAND   7
104 #define FSRAND  8
105 #define FSIN    9
106 #define FCOS    10
107 #define FATAN   11
108 #define FTOUPPER 12
109 #define FTOLOWER 13
110 #define FFLUSH  14
111 #define FUTF    15
112
113 /* Node:  parse tree is made of nodes, with Cell's at bottom */
114
115 typedef struct Node {
116         int     ntype;
117         struct  Node *nnext;
118         int     lineno;
119         int     nobj;
120         struct  Node *narg[1];  /* variable: actual size set by calling malloc */
121 } Node;
122
123 #define NIL     ((Node *) 0)
124
125 extern Node     *winner;
126 extern Node     *nullstat;
127 extern Node     *nullnode;
128
129 /* ctypes */
130 #define OCELL   1
131 #define OBOOL   2
132 #define OJUMP   3
133
134 /* Cell subtypes: csub */
135 #define CFREE   7
136 #define CCOPY   6
137 #define CCON    5
138 #define CTEMP   4
139 #define CNAME   3 
140 #define CVAR    2
141 #define CFLD    1
142 #define CUNK    0
143
144 /* bool subtypes */
145 #define BTRUE   11
146 #define BFALSE  12
147
148 /* jump subtypes */
149 #define JEXIT   21
150 #define JNEXT   22
151 #define JBREAK  23
152 #define JCONT   24
153 #define JRET    25
154 #define JNEXTFILE       26
155
156 /* node types */
157 #define NVALUE  1
158 #define NSTAT   2
159 #define NEXPR   3
160
161
162 extern  int     pairstack[], paircnt;
163
164 #define notlegal(n)     (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
165 #define isvalue(n)      ((n)->ntype == NVALUE)
166 #define isexpr(n)       ((n)->ntype == NEXPR)
167 #define isjump(n)       ((n)->ctype == OJUMP)
168 #define isexit(n)       ((n)->csub == JEXIT)
169 #define isbreak(n)      ((n)->csub == JBREAK)
170 #define iscont(n)       ((n)->csub == JCONT)
171 #define isnext(n)       ((n)->csub == JNEXT)
172 #define isnextfile(n)   ((n)->csub == JNEXTFILE)
173 #define isret(n)        ((n)->csub == JRET)
174 #define isrec(n)        ((n)->tval & REC)
175 #define isfld(n)        ((n)->tval & FLD)
176 #define isstr(n)        ((n)->tval & STR)
177 #define isnum(n)        ((n)->tval & NUM)
178 #define isarr(n)        ((n)->tval & ARR)
179 #define isfcn(n)        ((n)->tval & FCN)
180 #define istrue(n)       ((n)->csub == BTRUE)
181 #define istemp(n)       ((n)->csub == CTEMP)
182 #define isargument(n)   ((n)->nobj == ARG)
183 /* #define freeable(p)  (!((p)->tval & DONTFREE)) */
184 #define freeable(p)     ( ((p)->tval & (STR|DONTFREE)) == STR )
185
186 #include "proto.h"