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