File:
[local] /
rpl /
rplawk /
awk.h
Revision
1.2:
download - view:
text,
annotated -
select for diffs -
revision graph
Wed Jun 12 09:48:22 2013 UTC (11 years, 10 months ago) by
bertrand
Branches:
MAIN
CVS tags:
rpl-4_1_35,
rpl-4_1_34,
rpl-4_1_33,
rpl-4_1_32,
rpl-4_1_31,
rpl-4_1_30,
rpl-4_1_29,
rpl-4_1_28,
rpl-4_1_27,
rpl-4_1_26,
rpl-4_1_25,
rpl-4_1_24,
rpl-4_1_23,
rpl-4_1_22,
rpl-4_1_21,
rpl-4_1_20,
rpl-4_1_19,
rpl-4_1_18,
rpl-4_1_17,
rpl-4_1_16,
rpl-4_1_15,
rpl-4_1_14,
HEAD
Cohérence.
1: /****************************************************************
2: Copyright (C) Lucent Technologies 1997
3: All Rights Reserved
4:
5: Permission to use, copy, modify, and distribute this software and
6: its documentation for any purpose and without fee is hereby
7: granted, provided that the above copyright notice appear in all
8: copies and that both that the copyright notice and this
9: permission notice and warranty disclaimer appear in supporting
10: documentation, and that the name Lucent Technologies or any of
11: its entities not be used in advertising or publicity pertaining
12: to distribution of the software without specific, written prior
13: permission.
14:
15: LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17: IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
18: SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
20: IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
22: THIS SOFTWARE.
23: ****************************************************************/
24:
25: #include <assert.h>
26:
27: typedef double Awkfloat;
28:
29: /* unsigned char is more trouble than it's worth */
30:
31: typedef unsigned char uschar;
32:
33: #define xfree(a) { if ((a) != NULL) { free((void *) (a)); (a) = NULL; } }
34:
35: #define NN(p) ((p) ? (p) : "(null)") /* guaranteed non-null for dprintf
36: */
37: #define DEBUG
38: #ifdef DEBUG
39: /* uses have to be doubly parenthesized */
40: # define dprintf(x) if (dbg) printf x
41: #else
42: # define dprintf(x)
43: #endif
44:
45: extern int compile_time; /* 1 if compiling, 0 if running */
46: extern int safe; /* 0 => unsafe, 1 => safe */
47:
48: #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */
49: extern int recsize; /* size of current record, orig RECSIZE */
50:
51: extern char **FS;
52: extern char **RS;
53: extern char **ORS;
54: extern char **OFS;
55: extern char **OFMT;
56: extern Awkfloat *NR;
57: extern Awkfloat *FNR;
58: extern Awkfloat *NF;
59: extern char **FILENAME;
60: extern char **SUBSEP;
61: extern Awkfloat *RSTART;
62: extern Awkfloat *RLENGTH;
63:
64: extern char *record; /* points to $0 */
65: extern int lineno; /* line number in awk program */
66: extern int errorflag; /* 1 if error has occurred */
67: extern int donefld; /* 1 if record broken into fields */
68: extern int donerec; /* 1 if record is valid (no fld has changed */
69: extern char inputFS[]; /* FS at time of input, for field splitting */
70:
71: extern int dbg;
72:
73: extern char *patbeg; /* beginning of pattern matched */
74: extern int patlen; /* length of pattern matched. set in b.c */
75:
76: /* Cell: all information about a variable or constant */
77:
78: typedef struct Cell {
79: uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */
80: uschar csub; /* CCON, CTEMP, CFLD, etc. */
81: char *nval; /* name, for variables only */
82: char *sval; /* string value */
83: Awkfloat fval; /* value as number */
84: int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
85: struct Cell *cnext; /* ptr to next if chained */
86: } Cell;
87:
88: typedef struct Array { /* symbol table array */
89: int nelem; /* elements in table right now */
90: int size; /* size of tab */
91: Cell **tab; /* hash table pointers */
92: } Array;
93:
94: #define NSYMTAB 50 /* initial size of a symbol table */
95: extern Array *symtab;
96:
97: extern Cell *nrloc; /* NR */
98: extern Cell *fnrloc; /* FNR */
99: extern Cell *nfloc; /* NF */
100: extern Cell *rstartloc; /* RSTART */
101: extern Cell *rlengthloc; /* RLENGTH */
102:
103: /* Cell.tval values: */
104: #define NUM 01 /* number value is valid */
105: #define STR 02 /* string value is valid */
106: #define DONTFREE 04 /* string space is not freeable */
107: #define CON 010 /* this is a constant */
108: #define ARR 020 /* this is an array */
109: #define FCN 040 /* this is a function name */
110: #define FLD 0100 /* this is a field $1, $2, ... */
111: #define REC 0200 /* this is $0 */
112:
113:
114: /* function types */
115: #define FLENGTH 1
116: #define FSQRT 2
117: #define FEXP 3
118: #define FLOG 4
119: #define FINT 5
120: #define FSYSTEM 6
121: #define FRAND 7
122: #define FSRAND 8
123: #define FSIN 9
124: #define FCOS 10
125: #define FATAN 11
126: #define FTOUPPER 12
127: #define FTOLOWER 13
128: #define FFLUSH 14
129:
130: /* Node: parse tree is made of nodes, with Cell's at bottom */
131:
132: typedef struct Node {
133: int ntype;
134: struct Node *nnext;
135: int lineno;
136: int nobj;
137: struct Node *narg[1]; /* variable: actual size set by calling malloc */
138: } Node;
139:
140: #define NIL ((Node *) 0)
141:
142: extern Node *winner;
143: extern Node *nullstat;
144: extern Node *nullnode;
145:
146: /* ctypes */
147: #define OCELL 1
148: #define OBOOL 2
149: #define OJUMP 3
150:
151: /* Cell subtypes: csub */
152: #define CFREE 7
153: #define CCOPY 6
154: #define CCON 5
155: #define CTEMP 4
156: #define CNAME 3
157: #define CVAR 2
158: #define CFLD 1
159: #define CUNK 0
160:
161: /* bool subtypes */
162: #define BTRUE 11
163: #define BFALSE 12
164:
165: /* jump subtypes */
166: #define JEXIT 21
167: #define JNEXT 22
168: #define JBREAK 23
169: #define JCONT 24
170: #define JRET 25
171: #define JNEXTFILE 26
172:
173: /* node types */
174: #define NVALUE 1
175: #define NSTAT 2
176: #define NEXPR 3
177:
178:
179: extern int pairstack[], paircnt;
180:
181: #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
182: #define isvalue(n) ((n)->ntype == NVALUE)
183: #define isexpr(n) ((n)->ntype == NEXPR)
184: #define isjump(n) ((n)->ctype == OJUMP)
185: #define isexit(n) ((n)->csub == JEXIT)
186: #define isbreak(n) ((n)->csub == JBREAK)
187: #define iscont(n) ((n)->csub == JCONT)
188: #define isnext(n) ((n)->csub == JNEXT || (n)->csub == JNEXTFILE)
189: #define isret(n) ((n)->csub == JRET)
190: #define isrec(n) ((n)->tval & REC)
191: #define isfld(n) ((n)->tval & FLD)
192: #define isstr(n) ((n)->tval & STR)
193: #define isnum(n) ((n)->tval & NUM)
194: #define isarr(n) ((n)->tval & ARR)
195: #define isfcn(n) ((n)->tval & FCN)
196: #define istrue(n) ((n)->csub == BTRUE)
197: #define istemp(n) ((n)->csub == CTEMP)
198: #define isargument(n) ((n)->nobj == ARG)
199: /* #define freeable(p) (!((p)->tval & DONTFREE)) */
200: #define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR )
201:
202: /* structures used by regular expression matching machinery, mostly b.c: */
203:
204: #define NCHARS (256+3) /* 256 handles 8-bit chars; 128 does 7-bit */
205: /* watch out in match(), etc. */
206: #define NSTATES 32
207:
208: typedef struct rrow {
209: long ltype; /* long avoids pointer warnings on 64-bit */
210: union {
211: int i;
212: Node *np;
213: uschar *up;
214: } lval; /* because Al stores a pointer in it! */
215: int *lfollow;
216: } rrow;
217:
218: typedef struct fa {
219: uschar gototab[NSTATES][NCHARS];
220: uschar out[NSTATES];
221: uschar *restr;
222: int *posns[NSTATES];
223: int anchor;
224: int use;
225: int initstat;
226: int curstat;
227: int accept;
228: int reset;
229: struct rrow re[1]; /* variable: actual size set by calling malloc */
230: } fa;
231:
232:
233: #include "proto.h"
CVSweb interface <joel.bertrand@systella.fr>