1 /*    a2p.h
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4  *    2000, 2001, 2002, by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  */
9 
10 #define VOIDUSED 1
11 
12 #ifdef WIN32
13 #define _INC_WIN32_PERL5	/* kludge around win32 stdio layer */
14 #endif
15 
16 #ifdef VMS
17 #  include "config.h"
18 #elif defined(NETWARE)
19 #  include "../NetWare/config.h"
20 #else
21 #  include "../config.h"
22 #endif
23 
24 #if defined(__STDC__) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
25 # define STANDARD_C 1
26 #endif
27 
28 #ifdef WIN32
29 #undef USE_STDIO_PTR		/* XXX fast gets won't work, must investigate */
30 #  ifndef STANDARD_C
31 #    define STANDARD_C
32 #  endif
33 #  if defined(__BORLANDC__)
34 #    pragma warn -ccc
35 #    pragma warn -rch
36 #    pragma warn -sig
37 #    pragma warn -pia
38 #    pragma warn -par
39 #    pragma warn -aus
40 #    pragma warn -use
41 #    pragma warn -csu
42 #    pragma warn -pro
43 #  elif defined(_MSC_VER)
44 #  elif defined(__MINGW32__)
45 #  endif
46 #endif
47 
48 /* Use all the "standard" definitions? */
49 #if defined(STANDARD_C) && defined(I_STDLIB)
50 #   include <stdlib.h>
51 #endif /* STANDARD_C */
52 
53 #include <stdio.h>
54 
55 #ifdef I_MATH
56 #include <math.h>
57 #endif
58 
59 #ifdef I_SYS_TYPES
60 #  include <sys/types.h>
61 #endif
62 
63 #ifdef USE_NEXT_CTYPE
64 
65 #if NX_CURRENT_COMPILER_RELEASE >= 400
66 #include <objc/NXCType.h>
67 #else /*  NX_CURRENT_COMPILER_RELEASE < 400 */
68 #include <appkit/NXCType.h>
69 #endif /*  NX_CURRENT_COMPILER_RELEASE >= 400 */
70 
71 #else /* !USE_NEXT_CTYPE */
72 #include <ctype.h>
73 #endif /* USE_NEXT_CTYPE */
74 
75 #define MEM_SIZE Size_t
76 
77 #ifndef STANDARD_C
78     Malloc_t malloc (MEM_SIZE nbytes);
79     Malloc_t calloc (MEM_SIZE elements, MEM_SIZE size);
80     Malloc_t realloc (Malloc_t where, MEM_SIZE nbytes);
81     Free_t   free (Malloc_t where);
82 #endif
83 
84 #if defined(I_STRING) || defined(__cplusplus)
85 #   include <string.h>
86 #else
87 #   include <strings.h>
88 #endif
89 
90 #if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
91 #define strchr index
92 #define strrchr rindex
93 #endif
94 
95 #ifdef I_TIME
96 #   include <time.h>
97 #endif
98 
99 #ifdef I_SYS_TIME
100 #   ifdef I_SYS_TIME_KERNEL
101 #	define KERNEL
102 #   endif
103 #   include <sys/time.h>
104 #   ifdef I_SYS_TIME_KERNEL
105 #	undef KERNEL
106 #   endif
107 #endif
108 
109 #ifndef MSDOS
110 #  if defined(HAS_TIMES) && defined(I_SYS_TIMES)
111 #    include <sys/times.h>
112 #  endif
113 #endif
114 
115 #ifdef DOSISH
116 # if defined(OS2)
117 #   define PTHX_UNUSED
118 #   include "../os2ish.h"
119 # else
120 #   include "../dosish.h"
121 # endif
122 #else
123 # if defined(VMS)
124 #   define NO_PERL_TYPEDEFS
125 #   include "vmsish.h"
126 # endif
127 #endif
128 
129 #ifndef STANDARD_C
130 /* All of these are in stdlib.h or time.h for ANSI C */
131 Time_t time();
132 struct tm *gmtime(), *localtime();
133 #if defined(OEMVS) || defined(__OPEN_VM)
134 char *(strchr)(), *(strrchr)();
135 char *(strcpy)(), *(strcat)();
136 #else
137 char *strchr(), *strrchr();
138 char *strcpy(), *strcat();
139 #endif
140 #endif /* ! STANDARD_C */
141 
142 #ifdef VMS
143 #  include "handy.h"
144 #else
145 #  include "../handy.h"
146 #endif
147 
148 #undef Nullfp
149 #define Nullfp Null(FILE*)
150 
151 #define Nullop 0
152 
153 #define OPROG		1
154 #define OJUNK		2
155 #define OHUNKS		3
156 #define ORANGE		4
157 #define OPAT		5
158 #define OHUNK		6
159 #define OPPAREN		7
160 #define OPANDAND	8
161 #define OPOROR		9
162 #define OPNOT		10
163 #define OCPAREN		11
164 #define OCANDAND	12
165 #define OCOROR		13
166 #define OCNOT		14
167 #define ORELOP		15
168 #define ORPAREN		16
169 #define OMATCHOP	17
170 #define OMPAREN		18
171 #define OCONCAT		19
172 #define OASSIGN		20
173 #define OADD		21
174 #define OSUBTRACT	22
175 #define OMULT		23
176 #define ODIV		24
177 #define OMOD		25
178 #define OPOSTINCR	26
179 #define OPOSTDECR	27
180 #define OPREINCR	28
181 #define OPREDECR	29
182 #define OUMINUS		30
183 #define OUPLUS		31
184 #define OPAREN		32
185 #define OGETLINE	33
186 #define OSPRINTF	34
187 #define OSUBSTR		35
188 #define OSTRING		36
189 #define OSPLIT		37
190 #define OSNEWLINE	38
191 #define OINDEX		39
192 #define ONUM		40
193 #define OSTR		41
194 #define OVAR		42
195 #define OFLD		43
196 #define ONEWLINE	44
197 #define OCOMMENT	45
198 #define OCOMMA		46
199 #define OSEMICOLON	47
200 #define OSCOMMENT	48
201 #define OSTATES		49
202 #define OSTATE		50
203 #define OPRINT		51
204 #define OPRINTF		52
205 #define OBREAK		53
206 #define ONEXT		54
207 #define OEXIT		55
208 #define OCONTINUE	56
209 #define OREDIR		57
210 #define OIF		58
211 #define OWHILE		59
212 #define OFOR		60
213 #define OFORIN		61
214 #define OVFLD		62
215 #define OBLOCK		63
216 #define OREGEX		64
217 #define OLENGTH		65
218 #define OLOG		66
219 #define OEXP		67
220 #define OSQRT		68
221 #define OINT		69
222 #define ODO		70
223 #define OPOW		71
224 #define OSUB		72
225 #define OGSUB		73
226 #define OMATCH		74
227 #define OUSERFUN	75
228 #define OUSERDEF	76
229 #define OCLOSE		77
230 #define OATAN2		78
231 #define OSIN		79
232 #define OCOS		80
233 #define ORAND		81
234 #define OSRAND		82
235 #define ODELETE		83
236 #define OSYSTEM		84
237 #define OCOND		85
238 #define ORETURN		86
239 #define ODEFINED	87
240 #define OSTAR		88
241 
242 #ifdef DOINIT
243 char *opname[] = {
244     "0",
245     "PROG",
246     "JUNK",
247     "HUNKS",
248     "RANGE",
249     "PAT",
250     "HUNK",
251     "PPAREN",
252     "PANDAND",
253     "POROR",
254     "PNOT",
255     "CPAREN",
256     "CANDAND",
257     "COROR",
258     "CNOT",
259     "RELOP",
260     "RPAREN",
261     "MATCHOP",
262     "MPAREN",
263     "CONCAT",
264     "ASSIGN",
265     "ADD",
266     "SUBTRACT",
267     "MULT",
268     "DIV",
269     "MOD",
270     "POSTINCR",
271     "POSTDECR",
272     "PREINCR",
273     "PREDECR",
274     "UMINUS",
275     "UPLUS",
276     "PAREN",
277     "GETLINE",
278     "SPRINTF",
279     "SUBSTR",
280     "STRING",
281     "SPLIT",
282     "SNEWLINE",
283     "INDEX",
284     "NUM",
285     "STR",
286     "VAR",
287     "FLD",
288     "NEWLINE",
289     "COMMENT",
290     "COMMA",
291     "SEMICOLON",
292     "SCOMMENT",
293     "STATES",
294     "STATE",
295     "PRINT",
296     "PRINTF",
297     "BREAK",
298     "NEXT",
299     "EXIT",
300     "CONTINUE",
301     "REDIR",
302     "IF",
303     "WHILE",
304     "FOR",
305     "FORIN",
306     "VFLD",
307     "BLOCK",
308     "REGEX",
309     "LENGTH",
310     "LOG",
311     "EXP",
312     "SQRT",
313     "INT",
314     "DO",
315     "POW",
316     "SUB",
317     "GSUB",
318     "MATCH",
319     "USERFUN",
320     "USERDEF",
321     "CLOSE",
322     "ATAN2",
323     "SIN",
324     "COS",
325     "RAND",
326     "SRAND",
327     "DELETE",
328     "SYSTEM",
329     "COND",
330     "RETURN",
331     "DEFINED",
332     "STAR",
333     "89"
334 };
335 #else
336 extern char *opname[];
337 #endif
338 
339 EXT int mop INIT(1);
340 
341 union u_ops {
342     int ival;
343     char *cval;
344 };
345 #if defined(iAPX286) || defined(M_I286) || defined(I80286) 	/* 80286 hack */
346 #define OPSMAX (64000/sizeof(union u_ops))	/* approx. max segment size */
347 #else
348 #define OPSMAX 50000
349 #endif						 	/* 80286 hack */
350 EXT union u_ops ops[OPSMAX];
351 
352 typedef struct string STR;
353 typedef struct htbl HASH;
354 
355 #include "str.h"
356 #include "hash.h"
357 
358 
359 /* A string is TRUE if not "" or "0". */
360 #define True(val) (tmps = (val), (*tmps && !(*tmps == '0' && !tmps[1])))
361 EXT char *Yes INIT("1");
362 EXT char *No INIT("");
363 
364 #define str_get(str) (Str = (str), (Str->str_pok ? Str->str_ptr : str_2ptr(Str)))
365 EXT STR *Str;
366 
367 #define GROWSTR(pp,lp,len) if (*(lp) < (len)) growstr(pp,lp,len)
368 
369 /* Prototypes for things in a2p.c */
370 int aryrefarg ( int arg );
371 int bl ( int arg, int maybe );
372 void dump ( int branch );
373 int fixfargs ( int name, int arg, int prevargs );
374 int fixrargs ( char *name, int arg, int prevargs );
375 void fixup ( STR *str );
376 int numary ( int arg );
377 int oper0 ( int type );
378 int oper1 ( int type, int arg1 );
379 int oper2 ( int type, int arg1, int arg2 );
380 int oper3 ( int type, int arg1, int arg2, int arg3 );
381 int oper4 ( int type, int arg1, int arg2, int arg3, int arg4 );
382 int oper5 ( int type, int arg1, int arg2, int arg3, int arg4, int arg5 );
383 void putlines ( STR *str );
384 void putone ( void );
385 int rememberargs ( int arg );
386 char * scannum ( char *s );
387 char * scanpat ( char *s );
388 int string ( char *ptr, int len );
389 void yyerror ( char *s );
390 int yylex ( void );
391 
392 EXT int line INIT(0);
393 
394 EXT FILE *rsfp;
395 EXT char buf[2048];
396 EXT char *bufptr INIT(buf);
397 
398 EXT STR *linestr INIT(Nullstr);
399 
400 EXT char tokenbuf[2048];
401 EXT int expectterm INIT(TRUE);
402 
403 #ifdef DEBUGGING
404 EXT int debug INIT(0);
405 EXT int dlevel INIT(0);
406 #define YYDEBUG 1
407 extern int yydebug;
408 #else
409 # ifndef YYDEBUG
410 #  define YYDEBUG 0
411 # endif
412 #endif
413 
414 EXT STR *freestrroot INIT(Nullstr);
415 
416 EXT STR str_no;
417 EXT STR str_yes;
418 
419 EXT bool do_split INIT(FALSE);
420 EXT bool split_to_array INIT(FALSE);
421 EXT bool set_array_base INIT(FALSE);
422 EXT bool saw_RS INIT(FALSE);
423 EXT bool saw_OFS INIT(FALSE);
424 EXT bool saw_ORS INIT(FALSE);
425 EXT bool saw_line_op INIT(FALSE);
426 EXT bool in_begin INIT(TRUE);
427 EXT bool do_opens INIT(FALSE);
428 EXT bool do_fancy_opens INIT(FALSE);
429 EXT bool lval_field INIT(FALSE);
430 EXT bool do_chop INIT(FALSE);
431 EXT bool need_entire INIT(FALSE);
432 EXT bool absmaxfld INIT(FALSE);
433 EXT bool saw_altinput INIT(FALSE);
434 
435 EXT bool nomemok INIT(FALSE);
436 
437 EXT char const_FS INIT(0);
438 EXT char *namelist INIT(Nullch);
439 EXT char fswitch INIT(0);
440 EXT bool old_awk INIT(0);
441 
442 EXT int saw_FS INIT(0);
443 EXT int maxfld INIT(0);
444 EXT int arymax INIT(0);
445 EXT char *nameary[100];
446 
447 EXT STR *opens;
448 
449 EXT HASH *symtab;
450 EXT HASH *curarghash;
451 
452 #define P_MIN		0
453 #define P_LISTOP	5
454 #define P_COMMA		10
455 #define P_ASSIGN	15
456 #define P_COND		20
457 #define P_DOTDOT	25
458 #define P_OROR		30
459 #define P_ANDAND	35
460 #define P_OR		40
461 #define P_AND		45
462 #define P_EQ		50
463 #define P_REL		55
464 #define P_UNI		60
465 #define P_FILETEST	65
466 #define P_SHIFT		70
467 #define P_ADD		75
468 #define P_MUL		80
469 #define P_MATCH		85
470 #define P_UNARY		90
471 #define P_POW		95
472 #define P_AUTO		100
473 #define P_MAX		999
474 
475 EXT int an;
476