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