diff options
| author | jdolecek <jdolecek@NetBSD.org> | 2005-07-02 18:58:15 +0000 |
|---|---|---|
| committer | jdolecek <jdolecek@NetBSD.org> | 2005-07-02 18:58:15 +0000 |
| commit | 5a4553e7263db932b7822669cbbd05cb75c366ca (patch) | |
| tree | a1011bf9432d0dcab3ae7551a8aa2cf73149deee | |
| parent | e5687f9fff78b0c1c42303f0c8af689432934e38 (diff) | |
this should not have been committed, sorry
| -rw-r--r-- | dist/nawk/awk.shar | 15355 | ||||
| -rwxr-xr-x | dist/nawk/maketab | bin | 8935 -> 0 bytes | |||
| -rw-r--r-- | dist/nawk/vcvars32.bat | 33 |
3 files changed, 0 insertions, 15388 deletions
diff --git a/dist/nawk/awk.shar b/dist/nawk/awk.shar deleted file mode 100644 index 3b76d0e3f0b..00000000000 --- a/dist/nawk/awk.shar +++ /dev/null @@ -1,15355 +0,0 @@ -# To unbundle, sh this file -echo README 1>&2 -sed 's/.//' >README <<'//GO.SYSIN DD README' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --This is the version of awk described in "The AWK Programming Language", --by Al Aho, Brian Kernighan, and Peter Weinberger --(Addison-Wesley, 1988, ISBN 0-201-07981-X). -- --Changes, mostly bug fixes and occasional enhancements, are listed --in FIXES. If you distribute this code further, please please please --distribute FIXES with it. If you find errors, please report them --to bwk@bell-labs.com. Thanks. -- --The program itself is created by -- make --which should produce a sequence of messages roughly like this: -- -- yacc -d awkgram.y -- --conflicts: 43 shift/reduce, 85 reduce/reduce -- mv y.tab.c ytab.c -- mv y.tab.h ytab.h -- cc -c ytab.c -- cc -c b.c -- cc -c main.c -- cc -c parse.c -- cc maketab.c -o maketab -- ./maketab >proctab.c -- cc -c proctab.c -- cc -c tran.c -- cc -c lib.c -- cc -c run.c -- cc -c lex.c -- cc ytab.o b.o main.o parse.o proctab.o tran.o lib.o run.o lex.o -lm -- --This produces an executable a.out; you will eventually want to --move this to some place like /usr/bin/awk. -- --If your system does not have yacc or bison (the GNU --equivalent), you must compile the pieces manually. We have --included yacc output in ytab.c and ytab.h, and backup copies in --case you overwrite them. We have also included a copy of --proctab.c so you do not need to run maketab. -- --NOTE: This version uses ANSI C, as you should also. We have --compiled this without any changes using gcc -Wall and/or local C --compilers on a variety of systems, but new systems or compilers --may raise some new complaint; reports of difficulties are --welcome. -- --This also compiles with Visual C++ on all flavors of Windows, --*if* you provide versions of popen and pclose. The file --missing95.c contains versions that can be used to get started --with, though the underlying support has mysterious properties, --the symptom of which can be truncated pipe output. Beware. The --file makefile.win gives hints on how to proceed; if you run --vcvars32.bat, it will set up necessary paths and parameters so --you can subsequently run nmake -f makefile.win. Beware also that --when running on Windows under command.com, various quoting --conventions are different from Unix systems: single quotes won't --work around arguments, and various characters like % are --interpreted within double quotes. -- --This compiles without change on Macintosh OS X using gcc and --the standard developer tools. -- --This is also said to compile on Macintosh OS 9 systems, using the --file "buildmac" provided by Dan Allen (danallen@microsoft.com), --to whom many thanks. -- --The version of malloc that comes with some systems is sometimes --astonishly slow. If awk seems slow, you might try fixing that. --More generally, turning on optimization can significantly improve --awk's speed, perhaps by 1/3 for highest levels. -//GO.SYSIN DD README -echo FIXES 1>&2 -sed 's/.//' >FIXES <<'//GO.SYSIN DD FIXES' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --This file lists all bug fixes, changes, etc., made since the AWK book --was sent to the printers in August, 1987. -- --Apr 24, 2005: -- modified lib.c so that values of $0 et al are preserved in the END -- block, apparently as required by posix. thanks to havard eidnes -- for the report and code. -- --Jan 14, 2005: -- fixed infinite loop in parsing, originally found by brian tsang. -- thanks to arnold robbins for a suggestion that started me -- rethinking it. -- --Dec 31, 2004: -- prevent overflow of -f array in main, head off potential error in -- call of SYNTAX(), test malloc return in lib.c, all with thanks to -- todd miller. -- --Dec 22, 2004: -- cranked up size of NCHARS; coverity thinks it can be overrun with -- smaller size, and i think that's right. added some assertions to b.c -- to catch places where it might overrun. the RE code is still fragile. -- --Dec 5, 2004: -- fixed a couple of overflow problems with ridiculous field numbers: -- e.g., print $(2^32-1). thanks to ruslan ermilov, giorgos keramidas -- and david o'brien at freebsd.org for patches. this really should -- be re-done from scratch. -- --Nov 21, 2004: -- fixed another 25-year-old RE bug, in split. it's another failure -- to (re-)initialize. thanks to steve fisher for spotting this and -- providing a good test case. -- --Nov 22, 2003: -- fixed a bug in regular expressions that dates (so help me) from 1977; -- it's been there from the beginning. an anchored longest match that -- was longer than the number of states triggered a failure to initialize -- the machine properly. many thanks to moinak ghosh for not only finding -- this one but for providing a fix, in some of the most mysterious -- code known to man. -- -- fixed a storage leak in call() that appears to have been there since -- 1983 or so -- a function without an explicit return that assigns a -- string to a parameter leaked a Cell. thanks to moinak ghosh for -- spotting this very subtle one. -- --Jul 31, 2003: -- fixed, thanks to andrey chernov and ruslan ermilov, a bug in lex.c -- that mis-handled the character 255 in input. (it was being compared -- to EOF with a signed comparison.) -- --Jul 29, 2003: -- fixed (i think) the long-standing botch that included the beginning of -- line state ^ for RE's in the set of valid characters; this led to a -- variety of odd problems, including failure to properly match certain -- regular expressions in non-US locales. thanks to ruslan for keeping -- at this one. -- --Jul 28, 2003: -- n-th try at getting internationalization right, with thanks to volker -- kiefel, arnold robbins and ruslan ermilov for advice, though they -- should not be blamed for the outcome. according to posix, "." is the -- radix character in programs and command line arguments regardless of -- the locale; otherwise, the locale should prevail for input and output -- of numbers. so it's intended to work that way. -- -- i have rescinded the attempt to use strcoll in expanding shorthands in -- regular expressions (cclenter). its properties are much too -- surprising; for example [a-c] matches aAbBc in locale en_US but abBcC -- in locale fr_CA. i can see how this might arise by implementation -- but i cannot explain it to a human user. (this behavior can be seen -- in gawk as well; we're leaning on the same library.) -- -- the issue appears to be that strcoll is meant for sorting, where -- merging upper and lower case may make sense (though note that unix -- sort does not do this by default either). it is not appropriate -- for regular expressions, where the goal is to match specific -- patterns of characters. in any case, the notations [:lower:], etc., -- are available in awk, and they are more likely to work correctly in -- most locales. -- -- a moratorium is hereby declared on internationalization changes. -- i apologize to friends and colleagues in other parts of the world. -- i would truly like to get this "right", but i don't know what -- that is, and i do not want to keep making changes until it's clear. -- --Jul 4, 2003: -- fixed bug that permitted non-terminated RE, as in "awk /x". -- --Jun 1, 2003: -- subtle change to split: if source is empty, number of elems -- is always 0 and the array is not set. -- --Mar 21, 2003: -- added some parens to isblank, in another attempt to make things -- internationally portable. -- --Mar 14, 2003: -- the internationalization changes, somewhat modified, are now -- reinstated. in theory awk will now do character comparisons -- and case conversions in national language, but "." will always -- be the decimal point separator on input and output regardless -- of national language. isblank(){} has an #ifndef. -- -- this no longer compiles on windows: LC_MESSAGES isn't defined -- in vc6++. -- -- fixed subtle behavior in field and record splitting: if FS is -- a single character and RS is not empty, \n is NOT a separator. -- this tortuous reading is found in the awk book; behavior now -- matches gawk and mawk. -- --Dec 13, 2002: -- for the moment, the internationalization changes of nov 29 are -- rolled back -- programs like x = 1.2 don't work in some locales, -- because the parser is expecting x = 1,2. until i understand this -- better, this will have to wait. -- --Nov 29, 2002: -- modified b.c (with tiny changes in main and run) to support -- locales, using strcoll and iswhatever tests for posix character -- classes. thanks to ruslan ermilov (ru@freebsd.org) for code. -- the function isblank doesn't seem to have propagated to any -- header file near me, so it's there explicitly. not properly -- tested on non-ascii character sets by me. -- --Jun 28, 2002: -- modified run/format() and tran/getsval() to do a slightly better -- job on using OFMT for output from print and CONVFMT for other -- number->string conversions, as promised by posix and done by -- gawk and mawk. there are still places where it doesn't work -- right if CONVFMT is changed; by then the STR attribute of the -- variable has been irrevocably set. thanks to arnold robbins for -- code and examples. -- -- fixed subtle bug in format that could get core dump. thanks to -- Jaromir Dolecek <jdolecek@NetBSD.org> for finding and fixing. -- minor cleanup in run.c / format() at the same time. -- -- added some tests for null pointers to debugging printf's, which -- were never intended for external consumption. thanks to dave -- kerns (dkerns@lucent.com) for pointing this out. -- -- GNU compatibility: an empty regexp matches anything (thanks to -- dag-erling smorgrav, des@ofug.org). subject to reversion if -- this does more harm than good. -- -- pervasive small changes to make things more const-correct, as -- reported by gcc's -Wwrite-strings. as it says in the gcc manual, -- this may be more nuisance than useful. provoked by a suggestion -- and code from arnaud desitter, arnaud@nimbus.geog.ox.ac.uk -- -- minor documentation changes to note that this now compiles out -- of the box on Mac OS X. -- --Feb 10, 2002: -- changed types in posix chars structure to quiet solaris cc. -- --Jan 1, 2002: -- fflush() or fflush("") flushes all files and pipes. -- -- length(arrayname) returns number of elements; thanks to -- arnold robbins for suggestion. -- -- added a makefile.win to make it easier to build on windows. -- based on dan allen's buildwin.bat. -- --Nov 16, 2001: -- added support for posix character class names like [:digit:], -- which are not exactly shorter than [0-9] and perhaps no more -- portable. thanks to dag-erling smorgrav for code. -- --Feb 16, 2001: -- removed -m option; no longer needed, and it was actually -- broken (noted thanks to volker kiefel). -- --Feb 10, 2001: -- fixed an appalling bug in gettok: any sequence of digits, +,-, E, e, -- and period was accepted as a valid number if it started with a period. -- this would never have happened with the lex version. -- -- other 1-character botches, now fixed, include a bare $ and a -- bare " at the end of the input. -- --Feb 7, 2001: -- more (const char *) casts in b.c and tran.c to silence warnings. -- --Nov 15, 2000: -- fixed a bug introduced in august 1997 that caused expressions -- like $f[1] to be syntax errors. thanks to arnold robbins for -- noticing this and providing a fix. -- --Oct 30, 2000: -- fixed some nextfile bugs: not handling all cases. thanks to -- arnold robbins for pointing this out. new regressions added. -- -- close() is now a function. it returns whatever the library -- fclose returns, and -1 for closing a file or pipe that wasn't -- opened. -- --Sep 24, 2000: -- permit \n explicitly in character classes; won't work right -- if comes in as "[\n]" but ok as /[\n]/, because of multiple -- processing of \'s. thanks to arnold robbins. -- --July 5, 2000: -- minor fiddles in tran.c to keep compilers happy about uschar. -- thanks to norman wilson. -- --May 25, 2000: -- yet another attempt at making 8-bit input work, with another -- band-aid in b.c (member()), and some (uschar) casts to head -- off potential errors in subscripts (like isdigit). also -- changed HAT to NCHARS-2. thanks again to santiago vila. -- -- changed maketab.c to ignore apparently out of range definitions -- instead of halting; new freeBSD generates one. thanks to -- jon snader <jsnader@ix.netcom.com> for pointing out the problem. -- --May 2, 2000: -- fixed an 8-bit problem in b.c by making several char*'s into -- unsigned char*'s. not clear i have them all yet. thanks to -- Santiago Vila <sanvila@unex.es> for the bug report. -- --Apr 21, 2000: -- finally found and fixed a memory leak in function call; it's -- been there since functions were added ~1983. thanks to -- jon bentley for the test case that found it. -- -- added test in envinit to catch environment "variables" with -- names beginning with '='; thanks to Berend Hasselman. -- --Jul 28, 1999: -- added test in defn() to catch function foo(foo), which -- otherwise recurses until core dump. thanks to arnold -- robbins for noticing this. -- --Jun 20, 1999: -- added *bp in gettok in lex.c; appears possible to exit function -- without terminating the string. thanks to russ cox. -- --Jun 2, 1999: -- added function stdinit() to run to initialize files[] array, -- in case stdin, etc., are not constants; some compilers care. -- --May 10, 1999: -- replaced the ERROR ... FATAL, etc., macros with functions -- based on vprintf, to avoid problems caused by overrunning -- fixed-size errbuf array. thanks to ralph corderoy for the -- impetus, and for pointing out a string termination bug in -- qstring as well. -- --Apr 21, 1999: -- fixed bug that caused occasional core dumps with commandline -- variable with value ending in \. (thanks to nelson beebe for -- the test case.) -- --Apr 16, 1999: -- with code kindly provided by Bruce Lilly, awk now parses -- /=/ and similar constructs more sensibly in more places. -- Bruce also provided some helpful test cases. -- --Apr 5, 1999: -- changed true/false to True/False in run.c to make it -- easier to compile with C++. Added some casts on malloc -- and realloc to be honest about casts; ditto. changed -- ltype int to long in struct rrow to reduce some 64-bit -- complaints; other changes scattered throughout for the -- same purpose. thanks to Nelson Beebe for these portability -- improvements. -- -- removed some horrible pointer-int casting in b.c and elsewhere -- by adding ptoi and itonp to localize the casts, which are -- all benign. fixed one incipient bug that showed up on sgi -- in 64-bit mode. -- -- reset lineno for new source file; include filename in error -- message. also fixed line number error in continuation lines. -- (thanks to Nelson Beebe for both of these.) -- --Mar 24, 1999: -- Nelson Beebe notes that irix 5.3 yacc dies with a bogus -- error; use a newer version or switch to bison, since sgi -- is unlikely to fix it. -- --Mar 5, 1999: -- changed isnumber to is_number to avoid the problem caused by -- versions of ctype.h that include the name isnumber. -- -- distribution now includes a script for building on a Mac, -- thanks to Dan Allen. -- --Feb 20, 1999: -- fixed memory leaks in run.c (call) and tran.c (setfval). -- thanks to Stephen Nutt for finding these and providing the fixes. -- --Jan 13, 1999: -- replaced srand argument by (unsigned int) in run.c; -- avoids problem on Mac and potentially on Unix & Windows. -- thanks to Dan Allen. -- -- added a few (int) casts to silence useless compiler warnings. -- e.g., errorflag= in run.c jump(). -- -- added proctab.c to the bundle outout; one less thing -- to have to compile out of the box. -- -- added calls to _popen and _pclose to the win95 stub for -- pipes (thanks to Steve Adams for this helpful suggestion). -- seems to work, though properties are not well understood -- by me, and it appears that under some circumstances the -- pipe output is truncated. Be careful. -- --Oct 19, 1998: -- fixed a couple of bugs in getrec: could fail to update $0 -- after a getline var; because inputFS wasn't initialized, -- could split $0 on every character, a misleading diversion. -- -- fixed caching bug in makedfa: LRU was actually removing -- least often used. -- -- thanks to ross ridge for finding these, and for providing -- great bug reports. -- --May 12, 1998: -- fixed potential bug in readrec: might fail to update record -- pointer after growing. thanks to dan levy for spotting this -- and suggesting the fix. -- --Mar 12, 1998: -- added -V to print version number and die. -- --Feb 11, 1998: -- subtle silent bug in lex.c: if the program ended with a number -- longer than 1 digit, part of the input would be pushed back and -- parsed again because token buffer wasn't terminated right. -- example: awk 'length($0) > 10'. blush. at least i found it -- myself. -- --Aug 31, 1997: -- s/adelete/awkdelete/: SGI uses this in malloc.h. -- thanks to nelson beebe for pointing this one out. -- --Aug 21, 1997: -- fixed some bugs in sub and gsub when replacement includes \\. -- this is a dark, horrible corner, but at least now i believe that -- the behavior is the same as gawk and the intended posix standard. -- thanks to arnold robbins for advice here. -- --Aug 9, 1997: -- somewhat regretfully, replaced the ancient lex-based lexical -- analyzer with one written in C. it's longer, generates less code, -- and more portable; the old one depended too much on mysterious -- properties of lex that were not preserved in other environments. -- in theory these recognize the same language. -- -- now using strtod to test whether a string is a number, instead of -- the convoluted original function. should be more portable and -- reliable if strtod is implemented right. -- -- removed now-pointless optimization in makefile that tries to avoid -- recompilation when awkgram.y is changed but symbols are not. -- -- removed most fixed-size arrays, though a handful remain, some -- of which are unchecked. you have been warned. -- --Aug 4, 1997: -- with some trepidation, replaced the ancient code that managed -- fields and $0 in fixed-size arrays with arrays that grow on -- demand. there is still some tension between trying to make this -- run fast and making it clean; not sure it's right yet. -- -- the ill-conceived -mr and -mf arguments are now useful only -- for debugging. previous dynamic string code removed. -- -- numerous other minor cleanups along the way. -- --Jul 30, 1997: -- using code provided by dan levy (to whom profuse thanks), replaced -- fixed-size arrays and awkward kludges by a fairly uniform mechanism -- to grow arrays as needed for printf, sub, gsub, etc. -- --Jul 23, 1997: -- falling off the end of a function returns "" and 0, not 0. -- thanks to arnold robbins. -- --Jun 17, 1997: -- replaced several fixed-size arrays by dynamically-created ones -- in run.c; added overflow tests to some previously unchecked cases. -- getline, toupper, tolower. -- -- getline code is still broken in that recursive calls may wind -- up using the same space. [fixed later] -- -- increased RECSIZE to 8192 to push problems further over the horizon. -- -- added \r to \n as input line separator for programs, not data. -- damn CRLFs. -- -- modified format() to permit explicit printf("%c", 0) to include -- a null byte in output. thanks to ken stailey for the fix. -- -- added a "-safe" argument that disables file output (print >, -- print >>), process creation (cmd|getline, print |, system), and -- access to the environment (ENVIRON). this is a first approximation -- to a "safe" version of awk, but don't rely on it too much. thanks -- to joan feigenbaum and matt blaze for the inspiration long ago. -- --Jul 8, 1996: -- fixed long-standing bug in sub, gsub(/a/, "\\\\&"); thanks to -- ralph corderoy. -- --Jun 29, 1996: -- fixed awful bug in new field splitting; didn't get all the places -- where input was done. -- --Jun 28, 1996: -- changed field-splitting to conform to posix definition: fields are -- split using the value of FS at the time of input; it used to be -- the value when the field or NF was first referred to, a much less -- predictable definition. thanks to arnold robbins for encouragement -- to do the right thing. -- --May 28, 1996: -- fixed appalling but apparently unimportant bug in parsing octal -- numbers in reg exprs. -- -- explicit hex in reg exprs now limited to 2 chars: \xa, \xaa. -- --May 27, 1996: -- cleaned up some declarations so gcc -Wall is now almost silent. -- -- makefile now includes backup copies of ytab.c and lexyy.c in case -- one makes before looking; it also avoids recreating lexyy.c unless -- really needed. -- -- s/aprintf/awkprint, s/asprintf/awksprintf/ to avoid some name clashes -- with unwisely-written header files. -- -- thanks to jeffrey friedl for several of these. -- --May 26, 1996: -- an attempt to rationalize the (unsigned) char issue. almost all -- instances of unsigned char have been removed; the handful of places -- in b.c where chars are used as table indices have been hand-crafted. -- added some latin-1 tests to the regression, but i'm not confident; -- none of my compilers seem to care much. thanks to nelson beebe for -- pointing out some others that do care. -- --May 2, 1996: -- removed all register declarations. -- -- enhanced split(), as in gawk, etc: split(s, a, "") splits s into -- a[1]...a[length(s)] with each character a single element. -- -- made the same changes for field-splitting if FS is "". -- -- added nextfile, as in gawk: causes immediate advance to next -- input file. (thanks to arnold robbins for inspiration and code). -- -- small fixes to regexpr code: can now handle []], [[], and -- variants; [] is now a syntax error, rather than matching -- everything; [z-a] is now empty, not z. far from complete -- or correct, however. (thanks to jeffrey friedl for pointing out -- some awful behaviors.) -- --Apr 29, 1996: -- replaced uchar by uschar everywhere; apparently some compilers -- usurp this name and this causes conflicts. -- -- fixed call to time in run.c (bltin); arg is time_t *. -- -- replaced horrible pointer/long punning in b.c by a legitimate -- union. should be safer on 64-bit machines and cleaner everywhere. -- (thanks to nelson beebe for pointing out some of these problems.) -- -- replaced nested comments by #if 0...#endif in run.c, lib.c. -- -- removed getsval, setsval, execute macros from run.c and lib.c. -- machines are 100x faster than they were when these macros were -- first used. -- -- revised filenames: awk.g.y => awkgram.y, awk.lx.l => awklex.l, -- y.tab.[ch] => ytab.[ch], lex.yy.c => lexyy.c, all in the aid of -- portability to nameless systems. -- -- "make bundle" now includes yacc and lex output files for recipients -- who don't have yacc or lex. -- --Aug 15, 1995: -- initialized Cells in setsymtab more carefully; some fields -- were not set. (thanks to purify, all of whose complaints i -- think i now understand.) -- -- fixed at least one error in gsub that looked at -1-th element -- of an array when substituting for a null match (e.g., $). -- -- delete arrayname is now legal; it clears the elements but leaves -- the array, which may not be the right behavior. -- -- modified makefile: my current make can't cope with the test used -- to avoid unnecessary yacc invocations. -- --Jul 17, 1995: -- added dynamically growing strings to awk.lx.l and b.c -- to permit regular expressions to be much bigger. -- the state arrays can still overflow. -- --Aug 24, 1994: -- detect duplicate arguments in function definitions (mdm). -- --May 11, 1994: -- trivial fix to printf to limit string size in sub(). -- --Apr 22, 1994: -- fixed yet another subtle self-assignment problem: -- $1 = $2; $1 = $1 clobbered $1. -- -- Regression tests now use private echo, to avoid quoting problems. -- --Feb 2, 1994: -- changed error() to print line number as %d, not %g. -- --Jul 23, 1993: -- cosmetic changes: increased sizes of some arrays, -- reworded some error messages. -- -- added CONVFMT as in posix (just replaced OFMT in getsval) -- -- FILENAME is now "" until the first thing that causes a file -- to be opened. -- --Nov 28, 1992: -- deleted yyunput and yyoutput from proto.h; -- different versions of lex give these different declarations. -- --May 31, 1992: -- added -mr N and -mf N options: more record and fields. -- these really ought to adjust automatically. -- -- cleaned up some error messages; "out of space" now means -- malloc returned NULL in all cases. -- -- changed rehash so that if it runs out, it just returns; -- things will continue to run slow, but maybe a bit longer. -- --Apr 24, 1992: -- remove redundant close of stdin when using -f -. -- -- got rid of core dump with -d; awk -d just prints date. -- --Apr 12, 1992: -- added explicit check for /dev/std(in,out,err) in redirection. -- unlike gawk, no /dev/fd/n yet. -- -- added (file/pipe) builtin. hard to test satisfactorily. -- not posix. -- --Feb 20, 1992: -- recompile after abortive changes; should be unchanged. -- --Dec 2, 1991: -- die-casting time: converted to ansi C, installed that. -- --Nov 30, 1991: -- fixed storage leak in freefa, failing to recover [N]CCL. -- thanks to Bill Jones (jones@cs.usask.ca) -- --Nov 19, 1991: -- use RAND_MAX instead of literal in builtin(). -- --Nov 12, 1991: -- cranked up some fixed-size arrays in b.c, and added a test for -- overflow in penter. thanks to mark larsen. -- --Sep 24, 1991: -- increased buffer in gsub. a very crude fix to a general problem. -- and again on Sep 26. -- --Aug 18, 1991: -- enforce variable name syntax for commandline variables: has to -- start with letter or _. -- --Jul 27, 1991: -- allow newline after ; in for statements. -- --Jul 21, 1991: -- fixed so that in self-assignment like $1=$1, side effects -- like recomputing $0 take place. (this is getting subtle.) -- --Jun 30, 1991: -- better test for detecting too-long output record. -- --Jun 2, 1991: -- better defense against very long printf strings. -- made break and continue illegal outside of loops. -- --May 13, 1991: -- removed extra arg on gettemp, tempfree. minor error message rewording. -- --May 6, 1991: -- fixed silly bug in hex parsing in hexstr(). -- removed an apparently unnecessary test in isnumber(). -- warn about weird printf conversions. -- fixed unchecked array overwrite in relex(). -- -- changed for (i in array) to access elements in sorted order. -- then unchanged it -- it really does run slower in too many cases. -- left the code in place, commented out. -- --Feb 10, 1991: -- check error status on all writes, to avoid banging on full disks. -- --Jan 28, 1991: -- awk -f - reads the program from stdin. -- --Jan 11, 1991: -- failed to set numeric state on $0 in cmd|getline context in run.c. -- --Nov 2, 1990: -- fixed sleazy test for integrality in getsval; use modf. -- --Oct 29, 1990: -- fixed sleazy buggy code in lib.c that looked (incorrectly) for -- too long input lines. -- --Oct 14, 1990: -- fixed the bug on p. 198 in which it couldn't deduce that an -- argument was an array in some contexts. replaced the error -- message in intest() by code that damn well makes it an array. -- --Oct 8, 1990: -- fixed horrible bug: types and values were not preserved in -- some kinds of self-assignment. (in assign().) -- --Aug 24, 1990: -- changed NCHARS to 256 to handle 8-bit characters in strings -- presented to match(), etc. -- --Jun 26, 1990: -- changed struct rrow (awk.h) to use long instead of int for lval, -- since cfoll() stores a pointer in it. now works better when int's -- are smaller than pointers! -- --May 6, 1990: -- AVA fixed the grammar so that ! is uniformly of the same precedence as -- unary + and -. This renders illegal some constructs like !x=y, which -- now has to be parenthesized as !(x=y), and makes others work properly: -- !x+y is (!x)+y, and x!y is x !y, not two pattern-action statements. -- (These problems were pointed out by Bob Lenk of Posix.) -- -- Added \x to regular expressions (already in strings). -- Limited octal to octal digits; \8 and \9 are not octal. -- Centralized the code for parsing escapes in regular expressions. -- Added a bunch of tests to T.re and T.sub to verify some of this. -- --Feb 9, 1990: -- fixed null pointer dereference bug in main.c: -F[nothing]. sigh. -- -- restored srand behavior: it returns the current seed. -- --Jan 18, 1990: -- srand now returns previous seed value (0 to start). -- --Jan 5, 1990: -- fix potential problem in tran.c -- something was freed, -- then used in freesymtab. -- --Oct 18, 1989: -- another try to get the max number of open files set with -- relatively machine-independent code. -- -- small fix to input() in case of multiple reads after EOF. -- --Oct 11, 1989: -- FILENAME is now defined in the BEGIN block -- too many old -- programs broke. -- -- "-" means stdin in getline as well as on the commandline. -- -- added a bunch of casts to the code to tell the truth about -- char * vs. unsigned char *, a right royal pain. added a -- setlocale call to the front of main, though probably no one -- has it usefully implemented yet. -- --Aug 24, 1989: -- removed redundant relational tests against nullnode if parse -- tree already had a relational at that point. -- --Aug 11, 1989: -- fixed bug: commandline variable assignment has to look like -- var=something. (consider the man page for =, in file =.1) -- -- changed number of arguments to functions to static arrays -- to avoid repeated malloc calls. -- --Aug 2, 1989: -- restored -F (space) separator -- --Jul 30, 1989: -- added -v x=1 y=2 ... for immediate commandline variable assignment; -- done before the BEGIN block for sure. they have to precede the -- program if the program is on the commandline. -- Modified Aug 2 to require a separate -v for each assignment. -- --Jul 10, 1989: -- fixed ref-thru-zero bug in environment code in tran.c -- --Jun 23, 1989: -- add newline to usage message. -- --Jun 14, 1989: -- added some missing ansi printf conversion letters: %i %X %E %G. -- no sensible meaning for h or L, so they may not do what one expects. -- -- made %* conversions work. -- -- changed x^y so that if n is a positive integer, it's done -- by explicit multiplication, thus achieving maximum accuracy. -- (this should be done by pow() but it seems not to be locally.) -- done to x ^= y as well. -- --Jun 4, 1989: -- ENVIRON array contains environment: if shell variable V=thing, -- ENVIRON["V"] is "thing" -- -- multiple -f arguments permitted. error reporting is naive. -- (they were permitted before, but only the last was used.) -- -- fixed a really stupid botch in the debugging macro dprintf -- -- fixed order of evaluation of commandline assignments to match -- what the book claims: an argument of the form x=e is evaluated -- at the time it would have been opened if it were a filename (p 63). -- this invalidates the suggested answer to ex 4-1 (p 195). -- -- removed some code that permitted -F (space) fieldseparator, -- since it didn't quite work right anyway. (restored aug 2) -- --Apr 27, 1989: -- Line number now accumulated correctly for comment lines. -- --Apr 26, 1989: -- Debugging output now includes a version date, -- if one compiles it into the source each time. -- --Apr 9, 1989: -- Changed grammar to prohibit constants as 3rd arg of sub and gsub; -- prevents class of overwriting-a-constant errors. (Last one?) -- This invalidates the "banana" example on page 43 of the book. -- -- Added \a ("alert"), \v (vertical tab), \xhhh (hexadecimal), -- as in ANSI, for strings. Rescinded the sloppiness that permitted -- non-octal digits in \ooo. Warning: not all compilers and libraries -- will be able to deal with \x correctly. -- --Jan 9, 1989: -- Fixed bug that caused tempcell list to contain a duplicate. -- The fix is kludgy. -- --Dec 17, 1988: -- Catches some more commandline errors in main. -- Removed redundant decl of modf in run.c (confuses some compilers). -- Warning: there's no single declaration of malloc, etc., in awk.h -- that seems to satisfy all compilers. -- --Dec 7, 1988: -- Added a bit of code to error printing to avoid printing nulls. -- (Not clear that it actually would.) -- --Nov 27, 1988: -- With fear and trembling, modified the grammar to permit -- multiple pattern-action statements on one line without -- an explicit separator. By definition, this capitulation -- to the ghost of ancient implementations remains undefined -- and thus subject to change without notice or apology. -- DO NOT COUNT ON IT. -- --Oct 30, 1988: -- Fixed bug in call() that failed to recover storage. -- -- A warning is now generated if there are more arguments -- in the call than in the definition (in lieu of fixing -- another storage leak). -- --Oct 20, 1988: -- Fixed %c: if expr is numeric, use numeric value; -- otherwise print 1st char of string value. still -- doesn't work if the value is 0 -- won't print \0. -- -- Added a few more checks for running out of malloc. -- --Oct 12, 1988: -- Fixed bug in call() that freed local arrays twice. -- -- Fixed to handle deletion of non-existent array right; -- complains about attempt to delete non-array element. -- --Sep 30, 1988: -- Now guarantees to evaluate all arguments of built-in -- functions, as in C; the appearance is that arguments -- are evaluated before the function is called. Places -- affected are sub (gsub was ok), substr, printf, and -- all the built-in arithmetic functions in bltin(). -- A warning is generated if a bltin() is called with -- the wrong number of arguments. -- -- This requires changing makeprof on p167 of the book. -- --Aug 23, 1988: -- setting FILENAME in BEGIN caused core dump, apparently -- because it was freeing space not allocated by malloc. -- --July 24, 1988: -- fixed egregious error in toupper/tolower functions. -- still subject to rescinding, however. -- --July 2, 1988: -- flush stdout before opening file or pipe -- --July 2, 1988: -- performance bug in b.c/cgoto(): not freeing some sets of states. -- partial fix only right now, and the number of states increased -- to make it less obvious. -- --June 1, 1988: -- check error status on close -- --May 28, 1988: -- srand returns seed value it's using. -- see 1/18/90 -- --May 22, 1988: -- Removed limit on depth of function calls. -- --May 10, 1988: -- Fixed lib.c to permit _ in commandline variable names. -- --Mar 25, 1988: -- main.c fixed to recognize -- as terminator of command- -- line options. Illegal options flagged. -- Error reporting slightly cleaned up. -- --Dec 2, 1987: -- Newer C compilers apply a strict scope rule to extern -- declarations within functions. Two extern declarations in -- lib.c and tran.c have been moved to obviate this problem. -- --Oct xx, 1987: -- Reluctantly added toupper and tolower functions. -- Subject to rescinding without notice. -- --Sep 17, 1987: -- Error-message printer had printf(s) instead of -- printf("%s",s); got core dumps when the message -- included a %. -- --Sep 12, 1987: -- Very long printf strings caused core dump; -- fixed aprintf, asprintf, format to catch them. -- Can still get a core dump in printf itself. -- -- -//GO.SYSIN DD FIXES -echo awk.h 1>&2 -sed 's/.//' >awk.h <<'//GO.SYSIN DD awk.h' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --#include <assert.h> -- --typedef double Awkfloat; -- --/* unsigned char is more trouble than it's worth */ -- --typedef unsigned char uschar; -- --#define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } } -- --#define NN(p) ((p) ? (p) : "(null)") /* guaranteed non-null for dprintf --*/ --#define DEBUG --#ifdef DEBUG -- /* uses have to be doubly parenthesized */ --# define dprintf(x) if (dbg) printf x --#else --# define dprintf(x) --#endif -- --extern int compile_time; /* 1 if compiling, 0 if running */ --extern int safe; /* 0 => unsafe, 1 => safe */ -- --#define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */ --extern int recsize; /* size of current record, orig RECSIZE */ -- --extern char **FS; --extern char **RS; --extern char **ORS; --extern char **OFS; --extern char **OFMT; --extern Awkfloat *NR; --extern Awkfloat *FNR; --extern Awkfloat *NF; --extern char **FILENAME; --extern char **SUBSEP; --extern Awkfloat *RSTART; --extern Awkfloat *RLENGTH; -- --extern char *record; /* points to $0 */ --extern int lineno; /* line number in awk program */ --extern int errorflag; /* 1 if error has occurred */ --extern int donefld; /* 1 if record broken into fields */ --extern int donerec; /* 1 if record is valid (no fld has changed */ --extern char inputFS[]; /* FS at time of input, for field splitting */ -- --extern int dbg; -- --extern char *patbeg; /* beginning of pattern matched */ --extern int patlen; /* length of pattern matched. set in b.c */ -- --/* Cell: all information about a variable or constant */ -- --typedef struct Cell { -- uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */ -- uschar csub; /* CCON, CTEMP, CFLD, etc. */ -- char *nval; /* name, for variables only */ -- char *sval; /* string value */ -- Awkfloat fval; /* value as number */ -- int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */ -- struct Cell *cnext; /* ptr to next if chained */ --} Cell; -- --typedef struct Array { /* symbol table array */ -- int nelem; /* elements in table right now */ -- int size; /* size of tab */ -- Cell **tab; /* hash table pointers */ --} Array; -- --#define NSYMTAB 50 /* initial size of a symbol table */ --extern Array *symtab; -- --extern Cell *nrloc; /* NR */ --extern Cell *fnrloc; /* FNR */ --extern Cell *nfloc; /* NF */ --extern Cell *rstartloc; /* RSTART */ --extern Cell *rlengthloc; /* RLENGTH */ -- --/* Cell.tval values: */ --#define NUM 01 /* number value is valid */ --#define STR 02 /* string value is valid */ --#define DONTFREE 04 /* string space is not freeable */ --#define CON 010 /* this is a constant */ --#define ARR 020 /* this is an array */ --#define FCN 040 /* this is a function name */ --#define FLD 0100 /* this is a field $1, $2, ... */ --#define REC 0200 /* this is $0 */ -- -- --/* function types */ --#define FLENGTH 1 --#define FSQRT 2 --#define FEXP 3 --#define FLOG 4 --#define FINT 5 --#define FSYSTEM 6 --#define FRAND 7 --#define FSRAND 8 --#define FSIN 9 --#define FCOS 10 --#define FATAN 11 --#define FTOUPPER 12 --#define FTOLOWER 13 --#define FFLUSH 14 -- --/* Node: parse tree is made of nodes, with Cell's at bottom */ -- --typedef struct Node { -- int ntype; -- struct Node *nnext; -- int lineno; -- int nobj; -- struct Node *narg[1]; /* variable: actual size set by calling malloc */ --} Node; -- --#define NIL ((Node *) 0) -- --extern Node *winner; --extern Node *nullstat; --extern Node *nullnode; -- --/* ctypes */ --#define OCELL 1 --#define OBOOL 2 --#define OJUMP 3 -- --/* Cell subtypes: csub */ --#define CFREE 7 --#define CCOPY 6 --#define CCON 5 --#define CTEMP 4 --#define CNAME 3 --#define CVAR 2 --#define CFLD 1 --#define CUNK 0 -- --/* bool subtypes */ --#define BTRUE 11 --#define BFALSE 12 -- --/* jump subtypes */ --#define JEXIT 21 --#define JNEXT 22 --#define JBREAK 23 --#define JCONT 24 --#define JRET 25 --#define JNEXTFILE 26 -- --/* node types */ --#define NVALUE 1 --#define NSTAT 2 --#define NEXPR 3 -- -- --extern int pairstack[], paircnt; -- --#define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc) --#define isvalue(n) ((n)->ntype == NVALUE) --#define isexpr(n) ((n)->ntype == NEXPR) --#define isjump(n) ((n)->ctype == OJUMP) --#define isexit(n) ((n)->csub == JEXIT) --#define isbreak(n) ((n)->csub == JBREAK) --#define iscont(n) ((n)->csub == JCONT) --#define isnext(n) ((n)->csub == JNEXT || (n)->csub == JNEXTFILE) --#define isret(n) ((n)->csub == JRET) --#define isrec(n) ((n)->tval & REC) --#define isfld(n) ((n)->tval & FLD) --#define isstr(n) ((n)->tval & STR) --#define isnum(n) ((n)->tval & NUM) --#define isarr(n) ((n)->tval & ARR) --#define isfcn(n) ((n)->tval & FCN) --#define istrue(n) ((n)->csub == BTRUE) --#define istemp(n) ((n)->csub == CTEMP) --#define isargument(n) ((n)->nobj == ARG) --/* #define freeable(p) (!((p)->tval & DONTFREE)) */ --#define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR ) -- --/* structures used by regular expression matching machinery, mostly b.c: */ -- --#define NCHARS (256+3) /* 256 handles 8-bit chars; 128 does 7-bit */ -- /* watch out in match(), etc. */ --#define NSTATES 32 -- --typedef struct rrow { -- long ltype; /* long avoids pointer warnings on 64-bit */ -- union { -- int i; -- Node *np; -- uschar *up; -- } lval; /* because Al stores a pointer in it! */ -- int *lfollow; --} rrow; -- --typedef struct fa { -- uschar gototab[NSTATES][NCHARS]; -- uschar out[NSTATES]; -- uschar *restr; -- int *posns[NSTATES]; -- int anchor; -- int use; -- int initstat; -- int curstat; -- int accept; -- int reset; -- struct rrow re[1]; /* variable: actual size set by calling malloc */ --} fa; -- -- --#include "proto.h" -//GO.SYSIN DD awk.h -echo ytab.c 1>&2 -sed 's/.//' >ytab.c <<'//GO.SYSIN DD ytab.c' --/* A Bison parser, made by GNU Bison 1.875. */ -- --/* Skeleton parser for Yacc-like parsing with Bison, -- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2, or (at your option) -- any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place - Suite 330, -- Boston, MA 02111-1307, USA. */ -- --/* As a special exception, when this file is copied by Bison into a -- Bison output file, you may use that output file without restriction. -- This special exception was added by the Free Software Foundation -- in version 1.24 of Bison. */ -- --/* Written by Richard Stallman by simplifying the original so called -- ``semantic'' parser. */ -- --/* All symbols defined below should begin with yy or YY, to avoid -- infringing on user name space. This should be done even for local -- variables, as they might otherwise be expanded by user macros. -- There are some unavoidable exceptions within include files to -- define necessary library symbols; they are noted "INFRINGES ON -- USER NAME SPACE" below. */ -- --/* Identify Bison output. */ --#define YYBISON 1 -- --/* Skeleton name. */ --#define YYSKELETON_NAME "yacc.c" -- --/* Pure parsers. */ --#define YYPURE 0 -- --/* Using locations. */ --#define YYLSP_NEEDED 0 -- -- -- --/* Tokens. */ --#ifndef YYTOKENTYPE --# define YYTOKENTYPE -- /* Put the tokens into the symbol table, so that GDB and other debuggers -- know about them. */ -- enum yytokentype { -- FIRSTTOKEN = 258, -- PROGRAM = 259, -- PASTAT = 260, -- PASTAT2 = 261, -- XBEGIN = 262, -- XEND = 263, -- NL = 264, -- ARRAY = 265, -- MATCH = 266, -- NOTMATCH = 267, -- MATCHOP = 268, -- FINAL = 269, -- DOT = 270, -- ALL = 271, -- CCL = 272, -- NCCL = 273, -- CHAR = 274, -- OR = 275, -- STAR = 276, -- QUEST = 277, -- PLUS = 278, -- AND = 279, -- BOR = 280, -- APPEND = 281, -- EQ = 282, -- GE = 283, -- GT = 284, -- LE = 285, -- LT = 286, -- NE = 287, -- IN = 288, -- ARG = 289, -- BLTIN = 290, -- BREAK = 291, -- CLOSE = 292, -- CONTINUE = 293, -- DELETE = 294, -- DO = 295, -- EXIT = 296, -- FOR = 297, -- FUNC = 298, -- SUB = 299, -- GSUB = 300, -- IF = 301, -- INDEX = 302, -- LSUBSTR = 303, -- MATCHFCN = 304, -- NEXT = 305, -- NEXTFILE = 306, -- ADD = 307, -- MINUS = 308, -- MULT = 309, -- DIVIDE = 310, -- MOD = 311, -- ASSIGN = 312, -- ASGNOP = 313, -- ADDEQ = 314, -- SUBEQ = 315, -- MULTEQ = 316, -- DIVEQ = 317, -- MODEQ = 318, -- POWEQ = 319, -- PRINT = 320, -- PRINTF = 321, -- SPRINTF = 322, -- ELSE = 323, -- INTEST = 324, -- CONDEXPR = 325, -- POSTINCR = 326, -- PREINCR = 327, -- POSTDECR = 328, -- PREDECR = 329, -- VAR = 330, -- IVAR = 331, -- VARNF = 332, -- CALL = 333, -- NUMBER = 334, -- STRING = 335, -- REGEXPR = 336, -- GETLINE = 337, -- SUBSTR = 338, -- SPLIT = 339, -- RETURN = 340, -- WHILE = 341, -- CAT = 342, -- UMINUS = 343, -- NOT = 344, -- POWER = 345, -- INCR = 346, -- DECR = 347, -- INDIRECT = 348, -- LASTTOKEN = 349 -- }; --#endif --#define FIRSTTOKEN 258 --#define PROGRAM 259 --#define PASTAT 260 --#define PASTAT2 261 --#define XBEGIN 262 --#define XEND 263 --#define NL 264 --#define ARRAY 265 --#define MATCH 266 --#define NOTMATCH 267 --#define MATCHOP 268 --#define FINAL 269 --#define DOT 270 --#define ALL 271 --#define CCL 272 --#define NCCL 273 --#define CHAR 274 --#define OR 275 --#define STAR 276 --#define QUEST 277 --#define PLUS 278 --#define AND 279 --#define BOR 280 --#define APPEND 281 --#define EQ 282 --#define GE 283 --#define GT 284 --#define LE 285 --#define LT 286 --#define NE 287 --#define IN 288 --#define ARG 289 --#define BLTIN 290 --#define BREAK 291 --#define CLOSE 292 --#define CONTINUE 293 --#define DELETE 294 --#define DO 295 --#define EXIT 296 --#define FOR 297 --#define FUNC 298 --#define SUB 299 --#define GSUB 300 --#define IF 301 --#define INDEX 302 --#define LSUBSTR 303 --#define MATCHFCN 304 --#define NEXT 305 --#define NEXTFILE 306 --#define ADD 307 --#define MINUS 308 --#define MULT 309 --#define DIVIDE 310 --#define MOD 311 --#define ASSIGN 312 --#define ASGNOP 313 --#define ADDEQ 314 --#define SUBEQ 315 --#define MULTEQ 316 --#define DIVEQ 317 --#define MODEQ 318 --#define POWEQ 319 --#define PRINT 320 --#define PRINTF 321 --#define SPRINTF 322 --#define ELSE 323 --#define INTEST 324 --#define CONDEXPR 325 --#define POSTINCR 326 --#define PREINCR 327 --#define POSTDECR 328 --#define PREDECR 329 --#define VAR 330 --#define IVAR 331 --#define VARNF 332 --#define CALL 333 --#define NUMBER 334 --#define STRING 335 --#define REGEXPR 336 --#define GETLINE 337 --#define SUBSTR 338 --#define SPLIT 339 --#define RETURN 340 --#define WHILE 341 --#define CAT 342 --#define UMINUS 343 --#define NOT 344 --#define POWER 345 --#define INCR 346 --#define DECR 347 --#define INDIRECT 348 --#define LASTTOKEN 349 -- -- -- -- --/* Copy the first part of user declarations. */ --#line 25 "awkgram.y" -- --#include <stdio.h> --#include <string.h> --#include "awk.h" -- --void checkdup(Node *list, Cell *item); --int yywrap(void) { return(1); } -- --Node *beginloc = 0; --Node *endloc = 0; --int infunc = 0; /* = 1 if in arglist or body of func */ --int inloop = 0; /* = 1 if in while, for, do */ --char *curfname = 0; /* current function name */ --Node *arglist = 0; /* list of args for current function */ -- -- --/* Enabling traces. */ --#ifndef YYDEBUG --# define YYDEBUG 0 --#endif -- --/* Enabling verbose error messages. */ --#ifdef YYERROR_VERBOSE --# undef YYERROR_VERBOSE --# define YYERROR_VERBOSE 1 --#else --# define YYERROR_VERBOSE 0 --#endif -- --#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) --#line 41 "awkgram.y" --typedef union YYSTYPE { -- Node *p; -- Cell *cp; -- int i; -- char *s; --} YYSTYPE; --/* Line 191 of yacc.c. */ --#line 286 "y.tab.c" --# define yystype YYSTYPE /* obsolescent; will be withdrawn */ --# define YYSTYPE_IS_DECLARED 1 --# define YYSTYPE_IS_TRIVIAL 1 --#endif -- -- -- --/* Copy the second part of user declarations. */ -- -- --/* Line 214 of yacc.c. */ --#line 298 "y.tab.c" -- --#if ! defined (yyoverflow) || YYERROR_VERBOSE -- --/* The parser invokes alloca or malloc; define the necessary symbols. */ -- --# if YYSTACK_USE_ALLOCA --# define YYSTACK_ALLOC alloca --# else --# ifndef YYSTACK_USE_ALLOCA --# if defined (alloca) || defined (_ALLOCA_H) --# define YYSTACK_ALLOC alloca --# else --# ifdef __GNUC__ --# define YYSTACK_ALLOC __builtin_alloca --# endif --# endif --# endif --# endif -- --# ifdef YYSTACK_ALLOC -- /* Pacify GCC's `empty if-body' warning. */ --# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) --# else --# if defined (__STDC__) || defined (__cplusplus) --# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ --# define YYSIZE_T size_t --# endif --# define YYSTACK_ALLOC malloc --# define YYSTACK_FREE free --# endif --#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ -- -- --#if (! defined (yyoverflow) \ -- && (! defined (__cplusplus) \ -- || (YYSTYPE_IS_TRIVIAL))) -- --/* A type that is properly aligned for any stack member. */ --union yyalloc --{ -- short yyss; -- YYSTYPE yyvs; -- }; -- --/* The size of the maximum gap between one aligned stack and the next. */ --# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) -- --/* The size of an array large to enough to hold all stacks, each with -- N elements. */ --# define YYSTACK_BYTES(N) \ -- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ -- + YYSTACK_GAP_MAXIMUM) -- --/* Copy COUNT objects from FROM to TO. The source and destination do -- not overlap. */ --# ifndef YYCOPY --# if 1 < __GNUC__ --# define YYCOPY(To, From, Count) \ -- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) --# else --# define YYCOPY(To, From, Count) \ -- do \ -- { \ -- register YYSIZE_T yyi; \ -- for (yyi = 0; yyi < (Count); yyi++) \ -- (To)[yyi] = (From)[yyi]; \ -- } \ -- while (0) --# endif --# endif -- --/* Relocate STACK from its old location to the new one. The -- local variables YYSIZE and YYSTACKSIZE give the old and new number of -- elements in the stack, and YYPTR gives the new location of the -- stack. Advance YYPTR to a properly aligned location for the next -- stack. */ --# define YYSTACK_RELOCATE(Stack) \ -- do \ -- { \ -- YYSIZE_T yynewbytes; \ -- YYCOPY (&yyptr->Stack, Stack, yysize); \ -- Stack = &yyptr->Stack; \ -- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ -- yyptr += yynewbytes / sizeof (*yyptr); \ -- } \ -- while (0) -- --#endif -- --#if defined (__STDC__) || defined (__cplusplus) -- typedef signed char yysigned_char; --#else -- typedef short yysigned_char; --#endif -- --/* YYFINAL -- State number of the termination state. */ --#define YYFINAL 8 --/* YYLAST -- Last index in YYTABLE. */ --#define YYLAST 4569 -- --/* YYNTOKENS -- Number of terminals. */ --#define YYNTOKENS 111 --/* YYNNTS -- Number of nonterminals. */ --#define YYNNTS 49 --/* YYNRULES -- Number of rules. */ --#define YYNRULES 185 --/* YYNRULES -- Number of states. */ --#define YYNSTATES 367 -- --/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ --#define YYUNDEFTOK 2 --#define YYMAXUTOK 349 -- --#define YYTRANSLATE(YYX) \ -- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -- --/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ --static const unsigned char yytranslate[] = --{ -- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 103, 2, 2, -- 12, 16, 102, 100, 9, 101, 2, 15, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 93, 14, -- 2, 2, 2, 92, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 18, 2, 19, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 11, 13, 17, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, -- 5, 6, 7, 8, 10, 20, 21, 22, 23, 24, -- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, -- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, -- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, -- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, -- 85, 86, 87, 88, 89, 90, 91, 94, 95, 96, -- 97, 98, 99, 104, 105, 106, 107, 108, 109, 110 --}; -- --#if YYDEBUG --/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in -- YYRHS. */ --static const unsigned short yyprhs[] = --{ -- 0, 0, 3, 5, 7, 9, 12, 14, 17, 19, -- 22, 24, 27, 29, 32, 33, 46, 47, 58, 59, -- 68, 70, 72, 77, 79, 82, 84, 87, 88, 90, -- 91, 93, 94, 96, 98, 102, 104, 106, 111, 115, -- 122, 126, 131, 136, 137, 147, 149, 153, 155, 159, -- 163, 169, 173, 177, 181, 185, 189, 195, 198, 200, -- 202, 206, 212, 216, 220, 224, 228, 232, 236, 240, -- 244, 248, 252, 256, 262, 267, 271, 274, 276, 278, -- 282, 286, 288, 292, 293, 295, 299, 301, 303, 305, -- 307, 310, 313, 315, 318, 320, 323, 324, 329, 331, -- 334, 339, 344, 349, 352, 358, 361, 363, 365, 367, -- 370, 373, 376, 377, 378, 388, 392, 395, 397, 402, -- 405, 409, 412, 415, 419, 422, 425, 426, 430, 433, -- 435, 438, 440, 442, 447, 451, 455, 459, 463, 467, -- 471, 474, 477, 480, 484, 489, 491, 495, 500, 503, -- 506, 509, 512, 515, 520, 524, 527, 529, 536, 543, -- 547, 554, 561, 563, 572, 581, 588, 593, 595, 602, -- 609, 618, 627, 636, 643, 645, 647, 652, 654, 657, -- 658, 660, 664, 666, 668, 670 --}; -- --/* YYRHS -- A `-1'-separated list of the rules' RHS. */ --static const short yyrhs[] = --{ -- 112, 0, -1, 129, -1, 1, -1, 34, -1, 113, -- 10, -1, 35, -1, 114, 10, -1, 9, -1, 115, -- 10, -1, 50, -1, 116, 10, -1, 78, -1, 117, -- 10, -1, -1, 52, 12, 128, 14, 126, 136, 14, -- 126, 128, 146, 119, 149, -1, -1, 52, 12, 128, -- 14, 14, 126, 128, 146, 120, 149, -1, -1, 52, -- 12, 158, 43, 158, 146, 121, 149, -1, 85, -1, -- 88, -1, 56, 12, 136, 146, -1, 11, -1, 124, -- 10, -1, 10, -1, 125, 10, -1, -1, 125, -1, -- -1, 141, -1, -1, 147, -1, 127, -1, 127, 133, -- 127, -1, 136, -1, 130, -1, 130, 124, 153, 17, -- -1, 130, 9, 130, -1, 130, 9, 130, 124, 153, -- 17, -1, 124, 153, 17, -1, 7, 124, 153, 17, -- -1, 8, 124, 153, 17, -1, -1, 53, 122, 12, -- 157, 146, 132, 124, 153, 17, -1, 131, -1, 133, -- 127, 131, -1, 136, -1, 134, 115, 136, -1, 156, -- 68, 135, -1, 135, 92, 135, 93, 135, -1, 135, -- 114, 135, -1, 135, 113, 135, -1, 135, 23, 144, -- -1, 135, 23, 135, -1, 135, 43, 158, -1, 12, -- 137, 16, 43, 158, -1, 135, 155, -1, 143, -1, -- 155, -1, 156, 68, 136, -1, 136, 92, 136, 93, -- 136, -1, 136, 114, 136, -1, 136, 113, 136, -1, -- 136, 37, 136, -1, 136, 38, 136, -1, 136, 39, -- 136, -1, 136, 40, 136, -1, 136, 41, 136, -1, -- 136, 42, 136, -1, 136, 23, 144, -1, 136, 23, -- 136, -1, 136, 43, 158, -1, 12, 137, 16, 43, -- 158, -1, 136, 13, 94, 156, -1, 136, 13, 94, -- -1, 136, 155, -1, 143, -1, 155, -1, 136, 115, -- 136, -1, 137, 115, 136, -1, 135, -1, 138, 115, -- 135, -1, -1, 138, -1, 12, 137, 16, -1, 75, -- -1, 76, -1, 10, -1, 14, -1, 141, 10, -1, -- 141, 14, -1, 17, -1, 142, 10, -1, 144, -1, -- 105, 143, -1, -1, 15, 145, 91, 15, -1, 16, -- -1, 146, 10, -1, 140, 139, 13, 155, -1, 140, -- 139, 36, 155, -1, 140, 139, 39, 155, -1, 140, -- 139, -1, 49, 158, 18, 134, 19, -1, 49, 158, -- -1, 136, -1, 1, -1, 125, -1, 14, 126, -1, -- 46, 148, -1, 48, 148, -1, -1, -1, 116, 150, -- 149, 151, 98, 12, 136, 16, 148, -1, 51, 136, -- 148, -1, 51, 148, -1, 118, -1, 123, 149, 117, -- 149, -1, 123, 149, -1, 124, 153, 142, -1, 60, -- 148, -1, 61, 148, -1, 97, 136, 148, -1, 97, -- 148, -1, 147, 148, -1, -1, 159, 152, 149, -1, -- 14, 126, -1, 149, -1, 153, 149, -1, 54, -1, -- 55, -1, 155, 15, 68, 155, -1, 155, 100, 155, -- -1, 155, 101, 155, -1, 155, 102, 155, -1, 155, -- 15, 155, -1, 155, 103, 155, -1, 155, 106, 155, -- -1, 101, 155, -1, 100, 155, -1, 105, 155, -1, -- 45, 12, 16, -1, 45, 12, 134, 16, -1, 45, -- -1, 88, 12, 16, -1, 88, 12, 134, 16, -1, -- 47, 155, -1, 108, 156, -1, 107, 156, -1, 156, -- 108, -1, 156, 107, -1, 94, 156, 41, 155, -1, -- 94, 41, 155, -1, 94, 156, -1, 94, -1, 57, -- 12, 136, 115, 136, 16, -1, 57, 12, 136, 115, -- 144, 16, -1, 12, 136, 16, -1, 59, 12, 136, -- 115, 144, 16, -1, 59, 12, 136, 115, 136, 16, -- -1, 89, -1, 96, 12, 136, 115, 158, 115, 136, -- 16, -1, 96, 12, 136, 115, 158, 115, 144, 16, -- -1, 96, 12, 136, 115, 158, 16, -1, 77, 12, -- 134, 16, -1, 90, -1, 154, 12, 144, 115, 136, -- 16, -1, 154, 12, 136, 115, 136, 16, -1, 154, -- 12, 144, 115, 136, 115, 156, 16, -1, 154, 12, -- 136, 115, 136, 115, 156, 16, -1, 95, 12, 136, -- 115, 136, 115, 136, 16, -1, 95, 12, 136, 115, -- 136, 16, -1, 156, -1, 158, -1, 158, 18, 134, -- 19, -1, 86, -1, 109, 155, -1, -1, 85, -1, -- 157, 115, 85, -1, 85, -1, 44, -1, 87, -1, -- 98, 12, 136, 146, -1 --}; -- --/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ --static const unsigned short yyrline[] = --{ -- 0, 98, 98, 100, 104, 104, 108, 108, 112, 112, -- 116, 116, 120, 120, 124, 124, 126, 126, 128, 128, -- 133, 134, 138, 142, 142, 146, 146, 150, 151, 155, -- 156, 161, 162, 166, 167, 171, 175, 176, 177, 178, -- 179, 180, 182, 184, 184, 189, 190, 194, 195, 199, -- 200, 202, 204, 206, 207, 212, 213, 214, 215, 216, -- 220, 221, 223, 225, 227, 228, 229, 230, 231, 232, -- 233, 234, 239, 240, 241, 244, 247, 248, 249, 253, -- 254, 258, 259, 263, 264, 265, 269, 269, 273, 273, -- 273, 273, 277, 277, 281, 283, 287, 287, 291, 291, -- 295, 298, 301, 304, 305, 306, 307, 308, 312, 313, -- 317, 319, 321, 321, 321, 323, 324, 325, 326, 327, -- 328, 329, 332, 335, 336, 337, 338, 338, 339, 343, -- 344, 348, 348, 352, 353, 354, 355, 356, 357, 358, -- 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, -- 369, 370, 371, 372, 373, 374, 375, 376, 378, 381, -- 382, 384, 389, 390, 392, 394, 396, 397, 398, 400, -- 405, 407, 412, 414, 416, 420, 421, 422, 423, 427, -- 428, 429, 435, 436, 437, 442 --}; --#endif -- --#if YYDEBUG || YYERROR_VERBOSE --/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. -- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ --static const char *const yytname[] = --{ -- "$end", "error", "$undefined", "FIRSTTOKEN", "PROGRAM", "PASTAT", -- "PASTAT2", "XBEGIN", "XEND", "','", "NL", "'{'", "'('", "'|'", "';'", -- "'/'", "')'", "'}'", "'['", "']'", "ARRAY", "MATCH", "NOTMATCH", -- "MATCHOP", "FINAL", "DOT", "ALL", "CCL", "NCCL", "CHAR", "OR", "STAR", -- "QUEST", "PLUS", "AND", "BOR", "APPEND", "EQ", "GE", "GT", "LE", "LT", -- "NE", "IN", "ARG", "BLTIN", "BREAK", "CLOSE", "CONTINUE", "DELETE", -- "DO", "EXIT", "FOR", "FUNC", "SUB", "GSUB", "IF", "INDEX", "LSUBSTR", -- "MATCHFCN", "NEXT", "NEXTFILE", "ADD", "MINUS", "MULT", "DIVIDE", "MOD", -- "ASSIGN", "ASGNOP", "ADDEQ", "SUBEQ", "MULTEQ", "DIVEQ", "MODEQ", -- "POWEQ", "PRINT", "PRINTF", "SPRINTF", "ELSE", "INTEST", "CONDEXPR", -- "POSTINCR", "PREINCR", "POSTDECR", "PREDECR", "VAR", "IVAR", "VARNF", -- "CALL", "NUMBER", "STRING", "REGEXPR", "'?'", "':'", "GETLINE", -- "SUBSTR", "SPLIT", "RETURN", "WHILE", "CAT", "'+'", "'-'", "'*'", "'%'", -- "UMINUS", "NOT", "POWER", "INCR", "DECR", "INDIRECT", "LASTTOKEN", -- "$accept", "program", "and", "bor", "comma", "do", "else", "for", "@1", -- "@2", "@3", "funcname", "if", "lbrace", "nl", "opt_nl", "opt_pst", -- "opt_simple_stmt", "pas", "pa_pat", "pa_stat", "@4", "pa_stats", -- "patlist", "ppattern", "pattern", "plist", "pplist", "prarg", "print", -- "pst", "rbrace", "re", "reg_expr", "@5", "rparen", "simple_stmt", "st", -- "stmt", "@6", "@7", "@8", "stmtlist", "subop", "term", "var", "varlist", -- "varname", "while", 0 --}; --#endif -- --# ifdef YYPRINT --/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to -- token YYLEX-NUM. */ --static const unsigned short yytoknum[] = --{ -- 0, 256, 257, 258, 259, 260, 261, 262, 263, 44, -- 264, 123, 40, 124, 59, 47, 41, 125, 91, 93, -- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, -- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, -- 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, -- 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, -- 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, -- 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, -- 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -- 335, 336, 63, 58, 337, 338, 339, 340, 341, 342, -- 43, 45, 42, 37, 343, 344, 345, 346, 347, 348, -- 349 --}; --# endif -- --/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ --static const unsigned char yyr1[] = --{ -- 0, 111, 112, 112, 113, 113, 114, 114, 115, 115, -- 116, 116, 117, 117, 119, 118, 120, 118, 121, 118, -- 122, 122, 123, 124, 124, 125, 125, 126, 126, 127, -- 127, 128, 128, 129, 129, 130, 131, 131, 131, 131, -- 131, 131, 131, 132, 131, 133, 133, 134, 134, 135, -- 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, -- 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, -- 136, 136, 136, 136, 136, 136, 136, 136, 136, 137, -- 137, 138, 138, 139, 139, 139, 140, 140, 141, 141, -- 141, 141, 142, 142, 143, 143, 145, 144, 146, 146, -- 147, 147, 147, 147, 147, 147, 147, 147, 148, 148, -- 149, 149, 150, 151, 149, 149, 149, 149, 149, 149, -- 149, 149, 149, 149, 149, 149, 152, 149, 149, 153, -- 153, 154, 154, 155, 155, 155, 155, 155, 155, 155, -- 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, -- 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, -- 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, -- 155, 155, 155, 155, 155, 156, 156, 156, 156, 157, -- 157, 157, 158, 158, 158, 159 --}; -- --/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ --static const unsigned char yyr2[] = --{ -- 0, 2, 1, 1, 1, 2, 1, 2, 1, 2, -- 1, 2, 1, 2, 0, 12, 0, 10, 0, 8, -- 1, 1, 4, 1, 2, 1, 2, 0, 1, 0, -- 1, 0, 1, 1, 3, 1, 1, 4, 3, 6, -- 3, 4, 4, 0, 9, 1, 3, 1, 3, 3, -- 5, 3, 3, 3, 3, 3, 5, 2, 1, 1, -- 3, 5, 3, 3, 3, 3, 3, 3, 3, 3, -- 3, 3, 3, 5, 4, 3, 2, 1, 1, 3, -- 3, 1, 3, 0, 1, 3, 1, 1, 1, 1, -- 2, 2, 1, 2, 1, 2, 0, 4, 1, 2, -- 4, 4, 4, 2, 5, 2, 1, 1, 1, 2, -- 2, 2, 0, 0, 9, 3, 2, 1, 4, 2, -- 3, 2, 2, 3, 2, 2, 0, 3, 2, 1, -- 2, 1, 1, 4, 3, 3, 3, 3, 3, 3, -- 2, 2, 2, 3, 4, 1, 3, 4, 2, 2, -- 2, 2, 2, 4, 3, 2, 1, 6, 6, 3, -- 6, 6, 1, 8, 8, 6, 4, 1, 6, 6, -- 8, 8, 8, 6, 1, 1, 4, 1, 2, 0, -- 1, 3, 1, 1, 1, 4 --}; -- --/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state -- STATE-NUM when YYTABLE doesn't specify something else to do. Zero -- means the default is an error. */ --static const unsigned char yydefact[] = --{ -- 0, 3, 88, 89, 0, 33, 2, 30, 1, 0, -- 0, 23, 0, 96, 183, 145, 0, 0, 131, 132, -- 0, 0, 0, 182, 177, 184, 0, 162, 167, 156, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, -- 45, 29, 35, 77, 94, 0, 78, 174, 175, 90, -- 91, 0, 0, 0, 0, 0, 0, 0, 0, 148, -- 174, 20, 21, 0, 0, 0, 0, 0, 0, 155, -- 0, 0, 141, 140, 95, 142, 150, 149, 178, 107, -- 24, 27, 0, 0, 0, 10, 0, 0, 0, 0, -- 0, 86, 87, 0, 0, 112, 117, 0, 0, 106, -- 83, 0, 129, 0, 126, 0, 0, 34, 0, 0, -- 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, -- 0, 152, 151, 0, 0, 0, 8, 159, 0, 0, -- 0, 0, 143, 0, 47, 0, 179, 0, 0, 0, -- 146, 0, 154, 0, 0, 0, 25, 28, 128, 27, -- 108, 110, 111, 105, 0, 116, 0, 0, 121, 122, -- 0, 124, 0, 11, 0, 119, 0, 0, 81, 84, -- 103, 58, 59, 174, 125, 40, 130, 0, 38, 0, -- 46, 75, 71, 70, 64, 65, 66, 67, 68, 69, -- 72, 0, 5, 63, 7, 62, 0, 94, 0, 137, -- 134, 135, 136, 138, 139, 60, 0, 41, 42, 9, -- 79, 0, 80, 97, 144, 0, 180, 0, 0, 0, -- 166, 147, 153, 0, 0, 26, 109, 0, 115, 0, -- 32, 175, 0, 123, 0, 113, 12, 0, 92, 120, -- 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, -- 0, 0, 127, 0, 37, 74, 0, 0, 0, 133, -- 176, 73, 48, 98, 0, 43, 0, 94, 0, 94, -- 0, 0, 0, 27, 0, 22, 185, 0, 13, 118, -- 93, 85, 0, 54, 53, 55, 0, 52, 51, 82, -- 100, 101, 102, 49, 0, 61, 0, 0, 181, 99, -- 0, 157, 158, 161, 160, 173, 0, 165, 0, 104, -- 27, 0, 0, 0, 0, 0, 0, 39, 169, 0, -- 168, 0, 0, 0, 0, 94, 0, 0, 18, 0, -- 56, 0, 50, 0, 0, 0, 172, 163, 164, 0, -- 27, 0, 0, 171, 170, 44, 16, 0, 19, 0, -- 0, 0, 114, 17, 14, 0, 15 --}; -- --/* YYDEFGOTO[NTERM-NUM]. */ --static const short yydefgoto[] = --{ -- -1, 4, 120, 121, 225, 95, 247, 96, 365, 360, -- 351, 63, 97, 98, 160, 158, 5, 239, 6, 39, -- 40, 310, 41, 143, 178, 99, 54, 179, 180, 100, -- 7, 249, 43, 44, 55, 275, 101, 161, 102, 174, -- 287, 187, 103, 45, 46, 47, 227, 48, 104 --}; -- --/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing -- STATE-NUM. */ --#define YYPACT_NINF -323 --static const short yypact[] = --{ -- 680, -323, -323, -323, 34, 1573, -323, 106, -323, 29, -- 29, -323, 4106, -323, -323, 41, 4460, -73, -323, -323, -- 44, 92, 105, -323, -323, -323, 113, -323, -323, -11, -- 121, 131, 4460, 4460, 4165, 255, 255, 4460, 812, 94, -- -323, 174, 3436, -323, -323, 132, 130, -61, 30, -323, -- -323, 812, 812, 1663, 53, 64, 3929, 4106, 4460, 130, -- -21, -323, -323, 159, 4106, 4106, 4106, 3988, 4460, 65, -- 4106, 4106, 60, 60, -323, 60, -323, -323, -323, -323, -- -323, 162, 188, 188, 7, -323, 2182, 161, 196, 188, -- 188, -323, -323, 2182, 199, 176, -323, 1416, 812, 3436, -- 4224, 188, -323, 879, -323, 4106, 812, 1573, 118, 4106, -- -323, -323, 4106, 4106, 4106, 4106, 4106, 4106, 7, 4106, -- 2241, 2300, 130, 4106, 4283, 4460, 4460, 4460, 4460, 4460, -- 4106, -323, -323, 4106, 946, 1013, -323, -323, 2359, 157, -- 2359, 202, -323, 61, 3436, 2626, 133, 2023, 2023, 62, -- -323, 81, 130, 4460, 2023, 2023, -323, 214, -323, 162, -- 214, -323, -323, 209, 2123, -323, 1482, 4106, -323, -323, -- 2123, -323, 4106, -323, 1416, 156, 1080, 4106, 3811, 237, -- 83, -323, 130, -41, -323, -323, -323, 1416, 29, 1147, -- -323, 255, 3684, -323, 3684, 3684, 3684, 3684, 3684, 3684, -- -323, 2716, -323, 3605, -323, 3526, 2023, 237, 4460, 60, -- 58, 58, 60, 60, 60, 3436, 22, -323, -323, -323, -- 3436, 7, 3436, -323, -323, 2359, -323, 98, 2359, 2359, -- -323, -323, 130, 2359, 55, -323, -323, 4106, -323, 233, -- -323, -7, 2806, -323, 2806, -323, -323, 1215, -323, 238, -- 140, 4342, 7, 4342, 2418, 2477, 130, 2536, 4460, 4460, -- 4460, 4342, -323, 812, -323, -323, 4106, 2359, 2359, 130, -- -323, -323, 3436, -323, -5, 242, 2896, 239, 2986, 241, -- 1753, 149, 36, 191, 7, 242, 242, 163, -323, -323, -- -323, 225, 4106, 4401, -323, -323, 3743, 4047, 3870, 3811, -- 130, 130, 130, 3811, 1282, 3436, 1843, 1933, -323, -323, -- 29, -323, -323, -323, -323, -323, 2359, -323, 2359, -323, -- 162, 4106, 256, 259, 7, 154, 4342, -323, -323, 15, -- -323, 15, 812, 3076, 3166, 258, 1548, 3256, 242, 4106, -- -323, 225, 3811, 260, 262, 1349, -323, -323, -323, 256, -- 162, 1416, 3346, -323, -323, -323, 242, 1548, -323, 188, -- 1416, 256, -323, -323, 242, 1416, -323 --}; -- --/* YYPGOTO[NTERM-NUM]. */ --static const short yypgoto[] = --{ -- -323, -323, -146, -83, 200, -323, -323, -323, -323, -323, -- -323, -323, -323, 19, -80, -153, 234, -322, -323, 179, -- 172, -323, -323, -44, 12, 526, -174, -323, -323, -323, -- -323, -323, -32, -60, -323, -234, -162, -29, -53, -323, -- -323, -323, -13, -323, 269, -16, -323, -75, -323 --}; -- --/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If -- positive, shift that token. If negative, reduce the rule which -- number is the opposite. If zero, do what YYDEFACT says. -- If YYTABLE_NINF, syntax error. */ --#define YYTABLE_NINF -32 --static const short yytable[] = --{ -- 60, 157, 74, 250, 240, 219, 236, 130, 285, 163, -- 286, 133, 61, 69, 349, 62, 60, 60, 60, 76, -- 77, 60, 149, 151, 38, 219, 60, 261, 51, 52, -- 68, 136, 254, 14, 8, 361, 284, 60, 134, 135, -- 11, 270, 60, 200, 175, 136, 131, 132, 133, 193, -- 186, 14, 60, 56, 162, 319, 64, 165, 106, 14, -- 168, 169, 136, 207, 171, 219, 131, 132, 181, 139, -- 136, 136, 184, 124, 23, 24, 25, 224, 230, 157, -- 308, 186, 186, 60, 183, 176, 131, 132, 338, 216, -- 136, 241, 23, 189, 25, 255, 258, 231, 37, 14, -- 23, 24, 25, 105, 65, 11, 153, 136, 60, 60, -- 60, 60, 60, 60, 273, 356, 49, 66, 325, 259, -- 50, 245, 260, 186, 37, 67, 38, 364, 60, 60, -- 321, 60, 60, 70, 262, 238, 186, 60, 60, 60, -- 23, 243, 25, 71, 123, 124, 271, 254, 60, 136, -- 254, 254, 254, 254, 60, 141, 291, 254, 136, 281, -- 127, 128, 60, 136, 129, 317, 129, 336, 277, 279, -- 341, 146, 156, 166, 240, 265, 60, 295, 60, 60, -- 60, 60, 60, 60, 2, 60, 173, 60, 3, 60, -- 60, 294, 60, 282, 289, 240, 254, 357, 156, 60, -- 221, 156, 159, 157, 60, 320, 60, 263, 167, 322, -- 255, 172, 191, 255, 255, 255, 255, 223, 226, 181, -- 255, 181, 181, 181, 235, 181, 60, 237, 60, 181, -- 125, 126, 127, 128, 246, 183, 129, 183, 183, 183, -- 157, 183, 60, 60, 60, 183, 136, 283, 290, 340, -- 304, 186, 309, 138, 140, 312, 60, 314, 335, 255, -- 60, 323, 60, 293, 60, 296, 297, 298, 324, 299, -- 157, 339, 273, 303, 348, 107, 353, 60, 354, 190, -- 60, 60, 60, 60, 188, 59, 0, 60, 0, 60, -- 60, 60, 186, 0, 181, 0, 0, 0, 358, 14, -- 0, 72, 73, 75, 0, 0, 78, 363, 0, 0, -- 183, 122, 366, 343, 0, 344, 0, 60, 60, 345, -- 0, 60, 122, 0, 0, 0, 60, 75, 0, 332, -- 362, 0, 0, 0, 0, 0, 60, 152, 342, 0, -- 23, 24, 25, 0, 0, 0, 0, 228, 229, 0, -- 0, 0, 0, 0, 233, 234, 0, 0, 0, 0, -- 0, 0, 0, 0, 37, 0, 0, 0, 122, 182, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 209, 210, 211, 212, 213, 214, 0, -- 0, 0, 0, 0, 0, 0, 267, 268, 0, 0, -- 0, 0, 0, 122, 122, 0, 122, 122, 0, 0, -- 0, 0, 232, 122, 122, 0, 0, 274, 0, 0, -- 0, 0, 0, 122, 0, 0, 0, 0, 0, 122, -- 0, 0, 0, 0, 0, 0, 0, 256, 0, 0, -- 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 122, 0, 122, 122, 122, 122, 122, 122, 0, -- 122, 0, 122, 0, 122, 122, 0, 269, 0, 0, -- 316, 318, 0, 0, 122, 0, 0, 0, 0, 122, -- 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 329, 331, 0, 0, -- 0, 122, 0, 122, 0, 0, 0, 0, 0, 0, -- 182, 0, 182, 182, 182, 140, 182, 300, 301, 302, -- 182, 42, 0, 0, 0, 0, 0, 0, 53, 0, -- 0, 122, 0, 0, 0, 122, 0, 122, 0, 122, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 256, 0, 0, 256, 256, 256, 256, 0, -- 0, 0, 256, 0, 122, 122, 122, 0, 0, 0, -- 0, 0, 144, 145, 0, 0, 0, 0, 0, 0, -- 147, 148, 144, 144, 0, 182, 154, 155, 0, 0, -- 0, 0, 122, 122, 0, 0, 122, 0, 0, 0, -- 0, 256, 164, 0, 0, 0, 0, 0, 0, 170, -- 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 42, 0, 42, 0, 192, 0, 0, 194, 195, -- 196, 197, 198, 199, 0, 201, 203, 205, 0, 206, -- 0, 0, 0, 0, 0, 0, 215, 0, 0, 144, -- 0, 0, 0, 0, 220, 0, 222, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- -29, 1, 0, 0, 0, 0, 0, -29, -29, 0, -- 2, -29, -29, 242, 3, -29, 0, 0, 244, 0, -- 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, -29, -29, 0, -29, 0, 0, -- 0, 0, 0, -29, -29, -29, 0, -29, 0, -29, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 272, 0, 0, 276, 278, 0, -29, 0, 280, -- 0, 0, 0, 144, 0, -29, -29, -29, -29, -29, -- -29, 0, 0, 0, -29, -29, -29, 0, 0, 0, -- -29, -29, 0, 0, 0, -29, 0, -29, -29, -29, -- 0, 0, 305, 306, 307, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 79, 0, 0, 0, 0, 53, 0, -- 0, 0, 80, 11, 12, 0, 81, 13, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 333, 0, 334, 0, 0, 337, 0, 0, -- 0, 0, 0, 0, 0, 0, 14, 15, 82, 16, -- 83, 84, 85, 86, 87, 352, 18, 19, 88, 20, -- 0, 21, 89, 90, 0, 0, 0, 0, 0, 0, -- 79, 0, 0, 0, 0, 0, 0, 91, 92, 22, -- 11, 12, 0, 81, 13, 0, 185, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 93, -- 94, 0, 32, 33, 0, 0, 0, 34, 0, 35, -- 36, 37, 0, 14, 15, 82, 16, 83, 84, 85, -- 86, 87, 0, 18, 19, 88, 20, 0, 21, 89, -- 90, 0, 0, 0, 0, 0, 0, 79, 0, 0, -- 0, 0, 0, 0, 91, 92, 22, 11, 12, 0, -- 81, 13, 0, 217, 23, 24, 25, 26, 27, 28, -- 0, 0, 0, 29, 30, 31, 93, 94, 0, 32, -- 33, 0, 0, 0, 34, 0, 35, 36, 37, 0, -- 14, 15, 82, 16, 83, 84, 85, 86, 87, 0, -- 18, 19, 88, 20, 0, 21, 89, 90, 0, 0, -- 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, -- 0, 91, 92, 22, 11, 12, 0, 81, 13, 0, -- 218, 23, 24, 25, 26, 27, 28, 0, 0, 0, -- 29, 30, 31, 93, 94, 0, 32, 33, 0, 0, -- 0, 34, 0, 35, 36, 37, 0, 14, 15, 82, -- 16, 83, 84, 85, 86, 87, 0, 18, 19, 88, -- 20, 0, 21, 89, 90, 0, 0, 0, 0, 0, -- 0, 79, 0, 0, 0, 0, 0, 0, 91, 92, -- 22, 11, 12, 0, 81, 13, 0, 248, 23, 24, -- 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, -- 93, 94, 0, 32, 33, 0, 0, 0, 34, 0, -- 35, 36, 37, 0, 14, 15, 82, 16, 83, 84, -- 85, 86, 87, 0, 18, 19, 88, 20, 0, 21, -- 89, 90, 0, 0, 0, 0, 0, 0, 79, 0, -- 0, 0, 0, 0, 0, 91, 92, 22, 11, 12, -- 0, 81, 13, 0, 264, 23, 24, 25, 26, 27, -- 28, 0, 0, 0, 29, 30, 31, 93, 94, 0, -- 32, 33, 0, 0, 0, 34, 0, 35, 36, 37, -- 0, 14, 15, 82, 16, 83, 84, 85, 86, 87, -- 0, 18, 19, 88, 20, 0, 21, 89, 90, 0, -- 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, -- 0, 0, 91, 92, 22, 288, 11, 12, 0, 81, -- 13, 0, 23, 24, 25, 26, 27, 28, 0, 0, -- 0, 29, 30, 31, 93, 94, 0, 32, 33, 0, -- 0, 0, 34, 0, 35, 36, 37, 0, 0, 14, -- 15, 82, 16, 83, 84, 85, 86, 87, 0, 18, -- 19, 88, 20, 0, 21, 89, 90, 0, 0, 0, -- 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, -- 91, 92, 22, 11, 12, 0, 81, 13, 0, 327, -- 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, -- 30, 31, 93, 94, 0, 32, 33, 0, 0, 0, -- 34, 0, 35, 36, 37, 0, 14, 15, 82, 16, -- 83, 84, 85, 86, 87, 0, 18, 19, 88, 20, -- 0, 21, 89, 90, 0, 0, 0, 0, 0, 0, -- 79, 0, 0, 0, 0, 0, 0, 91, 92, 22, -- 11, 12, 0, 81, 13, 0, 355, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 93, -- 94, 0, 32, 33, 0, 0, 0, 34, 0, 35, -- 36, 37, 0, 14, 15, 82, 16, 83, 84, 85, -- 86, 87, 0, 18, 19, 88, 20, 0, 21, 89, -- 90, 0, 0, 0, 0, 0, 0, 79, 0, 0, -- 0, 0, 0, 0, 91, 92, 22, 11, 12, 0, -- 81, 13, 0, 0, 23, 24, 25, 26, 27, 28, -- 0, 0, 0, 29, 30, 31, 93, 94, 0, 32, -- 33, 0, 0, 0, 34, 0, 35, 36, 37, 0, -- 14, 15, 82, 16, 83, 84, 85, 86, 87, 0, -- 18, 19, 88, 20, 0, 21, 89, 90, 0, 0, -- 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, -- 0, 91, 92, 22, 12, 0, -31, 13, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 0, 0, -- 29, 30, 31, 93, 94, 0, 32, 33, 0, 0, -- 0, 34, 0, 35, 36, 37, 14, 15, 0, 16, -- 0, 84, 0, 0, 0, 0, 18, 19, 0, 20, -- 0, 21, 0, 0, 0, 0, 0, 0, 0, 79, -- 0, 0, 0, 0, 0, 0, 0, 91, 92, 22, -- 12, 0, 0, 13, -31, 0, 0, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 0, -- 9, 10, 32, 33, 11, 12, 0, 34, 13, 35, -- 36, 37, 14, 15, 0, 16, 0, 84, 0, 0, -- 0, 0, 18, 19, 0, 20, 0, 21, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 14, 15, 0, -- 16, 0, 0, 91, 92, 22, 17, 18, 19, 0, -- 20, 0, 21, 23, 24, 25, 26, 27, 28, 0, -- 0, 0, 29, 30, 31, 0, 0, 0, 32, 33, -- 22, 0, 0, 34, 0, 35, 36, 37, 23, 24, -- 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 34, 137, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 58, 315, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 58, 328, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 58, 330, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 58, 0, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 0, 32, 33, 0, 0, 0, 58, 0, -- 35, 36, 37, 156, 0, 57, 108, 159, 0, 0, -- 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 156, 0, 12, 0, 159, 13, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 0, 32, 33, 0, 14, 15, 58, 16, -- 35, 36, 37, 0, 0, 0, 18, 19, 0, 20, -- 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 202, 0, 12, 0, 0, 13, 0, 0, 22, -- 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 0, -- 0, 0, 32, 33, 0, 14, 15, 34, 16, 35, -- 36, 37, 0, 0, 0, 18, 19, 0, 20, 0, -- 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 204, 0, 12, 0, 0, 13, 0, 0, 22, 0, -- 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, -- 27, 28, 0, 0, 0, 29, 30, 31, 0, 0, -- 0, 32, 33, 0, 14, 15, 34, 16, 35, 36, -- 37, 0, 0, 0, 18, 19, 0, 20, 0, 21, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, -- 0, 12, 0, 0, 13, 0, 0, 22, 0, 0, -- 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, -- 28, 0, 0, 0, 29, 30, 31, 0, 0, 0, -- 32, 33, 0, 14, 15, 34, 16, 35, 36, 37, -- 0, 0, 0, 18, 19, 0, 20, 0, 21, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 202, 0, -- 292, 0, 0, 13, 0, 0, 22, 0, 0, 0, -- 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, -- 0, 0, 0, 29, 30, 31, 0, 0, 0, 32, -- 33, 0, 14, 15, 34, 16, 35, 36, 37, 0, -- 0, 0, 18, 19, 0, 20, 0, 21, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 204, 0, 292, -- 0, 0, 13, 0, 0, 22, 0, 0, 0, 0, -- 0, 0, 0, 23, 24, 25, 26, 27, 28, 0, -- 0, 0, 29, 30, 31, 0, 0, 0, 32, 33, -- 0, 14, 15, 34, 16, 35, 36, 37, 0, 0, -- 0, 18, 19, 0, 20, 0, 21, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 219, 0, 292, 0, -- 0, 13, 0, 0, 22, 0, 0, 0, 0, 0, -- 0, 0, 23, 24, 25, 26, 27, 28, 0, 0, -- 0, 29, 30, 31, 0, 0, 0, 32, 33, 0, -- 14, 15, 34, 16, 35, 36, 37, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 0, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 34, 137, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 0, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 266, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 273, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 311, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 313, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 346, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 347, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 350, 58, 0, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 359, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 0, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 0, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 0, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 57, 108, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 109, 0, -- 0, 58, 0, 35, 36, 37, 0, 0, 0, 0, -- 0, 0, 112, 113, 114, 115, 116, 117, 118, 14, -- 15, 0, 16, 0, 0, 0, 0, 0, 0, 18, -- 19, 0, 20, 0, 21, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, -- 23, 24, 25, 26, 27, 28, 57, -32, 0, 29, -- 30, 31, 0, 0, 0, 32, 33, -32, 0, 0, -- 58, 0, 35, 36, 37, 0, 0, 0, 0, 0, -- 0, -32, -32, -32, -32, -32, -32, -32, 14, 15, -- 0, 16, 0, 0, 0, 0, 0, 0, 18, 19, -- 0, 20, 0, 21, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, -- 0, 22, 0, 0, 0, 0, 251, 0, 0, 23, -- 24, 25, 26, 27, 28, 0, 0, 110, 111, 30, -- 31, 0, 0, 0, 32, 33, 252, 14, 15, 58, -- 16, 35, 36, 37, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 57, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 251, 253, 326, 29, 30, 31, -- 0, 0, 0, 32, 33, 110, 111, 0, 58, 0, -- 35, 36, 37, 0, 252, 14, 15, 0, 16, 0, -- 0, 0, 0, 0, 0, 18, 19, 0, 20, 0, -- 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 57, 0, 0, 0, 0, 0, 22, 0, -- 0, 0, 0, 251, 0, 0, 23, 24, 25, 26, -- 27, 28, 0, 253, 110, 29, 30, 31, 0, 0, -- 0, 32, 33, 252, 14, 15, 58, 16, 35, 36, -- 37, 0, 0, 0, 18, 19, 0, 20, 0, 21, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 12, 0, 0, 13, 142, 0, 22, 0, 0, -- 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, -- 28, 0, 0, 0, 29, 30, 31, 0, 0, 0, -- 32, 33, 0, 14, 15, 58, 16, 35, 36, 37, -- 0, 0, 0, 18, 19, 0, 20, 0, 21, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 12, 0, 0, 13, 150, 0, 22, 0, 0, 0, -- 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, -- 0, 0, 0, 29, 30, 31, 0, 0, 0, 32, -- 33, 0, 14, 15, 34, 16, 35, 36, 37, 0, -- 0, 0, 18, 19, 0, 20, 0, 21, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, -- 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, -- 251, 0, 0, 23, 24, 25, 26, 27, 28, 0, -- 0, 0, 29, 30, 31, 0, 0, 0, 32, 33, -- 252, 14, 15, 34, 16, 35, 36, 37, 0, 0, -- 0, 18, 19, 0, 20, 0, 21, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, -- 0, 13, 0, 0, 22, 0, 0, 0, 0, 0, -- 0, 0, 23, 24, 25, 26, 27, 28, 0, 0, -- 0, 29, 30, 31, 0, 0, 0, 32, 33, 0, -- 14, 15, 58, 16, 35, 36, 37, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, -- 13, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 0, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 0, 14, -- 15, 34, 16, 35, 36, 37, 0, 0, 0, 18, -- 19, 0, 20, 0, 21, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 177, 0, 0, 13, -- 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, -- 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, -- 30, 31, 0, 0, 0, 32, 33, 0, 14, 15, -- 34, 16, 35, 36, 37, 0, 0, 0, 18, 19, -- 0, 20, 0, 21, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, -- 0, 22, 0, 0, 0, 0, 0, 0, 0, 23, -- 24, 25, 26, 27, 28, 0, 0, 0, 29, 30, -- 31, 0, 0, 0, 32, 33, 0, 14, 15, 34, -- 16, 35, 36, 37, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 208, 0, 0, 292, 0, 0, 13, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, -- 0, 0, 0, 32, 33, 0, 14, 15, 58, 16, -- 35, 36, 37, 0, 0, 0, 18, 19, 0, 20, -- 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 57, 0, 0, 0, 0, 0, 22, -- 0, 0, 0, 0, -32, 0, 0, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 0, -- 0, 0, 32, 33, -32, 14, 15, 34, 16, 35, -- 36, 37, 0, 0, 0, 18, 19, 0, 20, 0, -- 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 57, 0, 0, 0, 0, 0, 22, 0, -- 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, -- 27, 28, 0, 0, 0, 0, 30, 31, 0, 0, -- 0, 32, 33, 0, 14, 15, 58, 16, 35, 36, -- 37, 0, 0, 0, 18, 19, 0, 20, 0, 21, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, -- 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, -- 28, 0, 0, 0, 29, 30, 31, 0, 0, 0, -- 32, 33, 0, 0, 0, 58, 0, 35, 36, 37 --}; -- --static const short yycheck[] = --{ -- 16, 81, 34, 177, 166, 10, 159, 68, 242, 84, -- 244, 18, 85, 29, 336, 88, 32, 33, 34, 35, -- 36, 37, 66, 67, 5, 10, 42, 68, 9, 10, -- 41, 9, 178, 44, 0, 357, 43, 53, 51, 52, -- 11, 19, 58, 118, 97, 9, 107, 108, 18, 109, -- 103, 44, 68, 12, 83, 19, 12, 86, 39, 44, -- 89, 90, 9, 123, 93, 10, 107, 108, 100, 16, -- 9, 9, 101, 15, 85, 86, 87, 16, 16, 159, -- 85, 134, 135, 99, 100, 98, 107, 108, 322, 133, -- 9, 166, 85, 106, 87, 178, 13, 16, 109, 44, -- 85, 86, 87, 9, 12, 11, 41, 9, 124, 125, -- 126, 127, 128, 129, 16, 349, 10, 12, 292, 36, -- 14, 174, 39, 176, 109, 12, 107, 361, 144, 145, -- 283, 147, 148, 12, 187, 164, 189, 153, 154, 155, -- 85, 170, 87, 12, 12, 15, 221, 293, 164, 9, -- 296, 297, 298, 299, 170, 91, 16, 303, 9, 234, -- 102, 103, 178, 9, 106, 16, 106, 320, 228, 229, -- 16, 12, 10, 12, 336, 191, 192, 252, 194, 195, -- 196, 197, 198, 199, 10, 201, 10, 203, 14, 205, -- 206, 251, 208, 237, 247, 357, 342, 350, 10, 215, -- 43, 10, 14, 283, 220, 14, 222, 188, 12, 284, -- 293, 12, 94, 296, 297, 298, 299, 15, 85, 251, -- 303, 253, 254, 255, 10, 257, 242, 18, 244, 261, -- 100, 101, 102, 103, 78, 251, 106, 253, 254, 255, -- 320, 257, 258, 259, 260, 261, 9, 14, 10, 324, -- 263, 304, 10, 53, 54, 16, 272, 16, 318, 342, -- 276, 98, 278, 251, 280, 253, 254, 255, 43, 257, -- 350, 12, 16, 261, 16, 41, 16, 293, 16, 107, -- 296, 297, 298, 299, 105, 16, -1, 303, -1, 305, -- 306, 307, 345, -1, 326, -1, -1, -1, 351, 44, -- -1, 32, 33, 34, -1, -1, 37, 360, -1, -1, -- 326, 42, 365, 329, -1, 331, -1, 333, 334, 332, -- -1, 337, 53, -1, -1, -1, 342, 58, -1, 310, -- 359, -1, -1, -1, -1, -1, 352, 68, 326, -1, -- 85, 86, 87, -1, -1, -1, -1, 147, 148, -1, -- -1, -1, -1, -1, 154, 155, -1, -1, -1, -1, -- -1, -1, -1, -1, 109, -1, -1, -1, 99, 100, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 179, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 124, 125, 126, 127, 128, 129, -1, -- -1, -1, -1, -1, -1, -1, 206, 207, -1, -1, -- -1, -1, -1, 144, 145, -1, 147, 148, -1, -1, -- -1, -1, 153, 154, 155, -1, -1, 227, -1, -1, -- -1, -1, -1, 164, -1, -1, -1, -1, -1, 170, -- -1, -1, -1, -1, -1, -1, -1, 178, -1, -1, -- 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 192, -1, 194, 195, 196, 197, 198, 199, -1, -- 201, -1, 203, -1, 205, 206, -1, 208, -1, -1, -- 280, 281, -1, -1, 215, -1, -1, -1, -1, 220, -- -1, 222, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, 306, 307, -1, -1, -- -1, 242, -1, 244, -1, -1, -1, -1, -1, -1, -- 251, -1, 253, 254, 255, 325, 257, 258, 259, 260, -- 261, 5, -1, -1, -1, -1, -1, -1, 12, -1, -- -1, 272, -1, -1, -1, 276, -1, 278, -1, 280, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 293, -1, -1, 296, 297, 298, 299, -1, -- -1, -1, 303, -1, 305, 306, 307, -1, -1, -1, -- -1, -1, 56, 57, -1, -1, -1, -1, -1, -1, -- 64, 65, 66, 67, -1, 326, 70, 71, -1, -1, -- -1, -1, 333, 334, -1, -1, 337, -1, -1, -1, -- -1, 342, 86, -1, -1, -1, -1, -1, -1, 93, -- -1, 352, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 105, -1, 107, -1, 109, -1, -1, 112, 113, -- 114, 115, 116, 117, -1, 119, 120, 121, -1, 123, -- -1, -1, -1, -1, -1, -1, 130, -1, -1, 133, -- -1, -1, -1, -1, 138, -1, 140, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 0, 1, -1, -1, -1, -1, -1, 7, 8, -1, -- 10, 11, 12, 167, 14, 15, -1, -1, 172, -1, -- -1, -1, -1, 177, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, 44, 45, -1, 47, -1, -1, -- -1, -1, -1, 53, 54, 55, -1, 57, -1, 59, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 225, -1, -1, 228, 229, -1, 77, -1, 233, -- -1, -1, -1, 237, -1, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, -1, -1, -1, -- 100, 101, -1, -1, -1, 105, -1, 107, 108, 109, -- -1, -1, 266, 267, 268, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 1, -1, -1, -1, -1, 292, -1, -- -1, -1, 10, 11, 12, -1, 14, 15, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 316, -1, 318, -1, -1, 321, -1, -1, -- -1, -1, -1, -1, -1, -1, 44, 45, 46, 47, -- 48, 49, 50, 51, 52, 339, 54, 55, 56, 57, -- -1, 59, 60, 61, -1, -1, -1, -1, -1, -1, -- 1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -- 11, 12, -1, 14, 15, -1, 17, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, 97, -- 98, -1, 100, 101, -1, -1, -1, 105, -1, 107, -- 108, 109, -1, 44, 45, 46, 47, 48, 49, 50, -- 51, 52, -1, 54, 55, 56, 57, -1, 59, 60, -- 61, -1, -1, -1, -1, -1, -1, 1, -1, -1, -- -1, -1, -1, -1, 75, 76, 77, 11, 12, -1, -- 14, 15, -1, 17, 85, 86, 87, 88, 89, 90, -- -1, -1, -1, 94, 95, 96, 97, 98, -1, 100, -- 101, -1, -1, -1, 105, -1, 107, 108, 109, -1, -- 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -- 54, 55, 56, 57, -1, 59, 60, 61, -1, -1, -- -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -- -1, 75, 76, 77, 11, 12, -1, 14, 15, -1, -- 17, 85, 86, 87, 88, 89, 90, -1, -1, -1, -- 94, 95, 96, 97, 98, -1, 100, 101, -1, -1, -- -1, 105, -1, 107, 108, 109, -1, 44, 45, 46, -- 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, -- 57, -1, 59, 60, 61, -1, -1, -1, -1, -1, -- -1, 1, -1, -1, -1, -1, -1, -1, 75, 76, -- 77, 11, 12, -1, 14, 15, -1, 17, 85, 86, -- 87, 88, 89, 90, -1, -1, -1, 94, 95, 96, -- 97, 98, -1, 100, 101, -1, -1, -1, 105, -1, -- 107, 108, 109, -1, 44, 45, 46, 47, 48, 49, -- 50, 51, 52, -1, 54, 55, 56, 57, -1, 59, -- 60, 61, -1, -1, -1, -1, -1, -1, 1, -1, -- -1, -1, -1, -1, -1, 75, 76, 77, 11, 12, -- -1, 14, 15, -1, 17, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, 97, 98, -1, -- 100, 101, -1, -1, -1, 105, -1, 107, 108, 109, -- -1, 44, 45, 46, 47, 48, 49, 50, 51, 52, -- -1, 54, 55, 56, 57, -1, 59, 60, 61, -1, -- -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -- -1, -1, 75, 76, 77, 10, 11, 12, -1, 14, -- 15, -1, 85, 86, 87, 88, 89, 90, -1, -1, -- -1, 94, 95, 96, 97, 98, -1, 100, 101, -1, -- -1, -1, 105, -1, 107, 108, 109, -1, -1, 44, -- 45, 46, 47, 48, 49, 50, 51, 52, -1, 54, -- 55, 56, 57, -1, 59, 60, 61, -1, -1, -1, -- -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -- 75, 76, 77, 11, 12, -1, 14, 15, -1, 17, -- 85, 86, 87, 88, 89, 90, -1, -1, -1, 94, -- 95, 96, 97, 98, -1, 100, 101, -1, -1, -1, -- 105, -1, 107, 108, 109, -1, 44, 45, 46, 47, -- 48, 49, 50, 51, 52, -1, 54, 55, 56, 57, -- -1, 59, 60, 61, -1, -1, -1, -1, -1, -1, -- 1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -- 11, 12, -1, 14, 15, -1, 17, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, 97, -- 98, -1, 100, 101, -1, -1, -1, 105, -1, 107, -- 108, 109, -1, 44, 45, 46, 47, 48, 49, 50, -- 51, 52, -1, 54, 55, 56, 57, -1, 59, 60, -- 61, -1, -1, -1, -1, -1, -1, 1, -1, -1, -- -1, -1, -1, -1, 75, 76, 77, 11, 12, -1, -- 14, 15, -1, -1, 85, 86, 87, 88, 89, 90, -- -1, -1, -1, 94, 95, 96, 97, 98, -1, 100, -- 101, -1, -1, -1, 105, -1, 107, 108, 109, -1, -- 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -- 54, 55, 56, 57, -1, 59, 60, 61, -1, -1, -- -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -- -1, 75, 76, 77, 12, -1, 14, 15, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, -1, -1, -- 94, 95, 96, 97, 98, -1, 100, 101, -1, -1, -- -1, 105, -1, 107, 108, 109, 44, 45, -1, 47, -- -1, 49, -1, -1, -1, -1, 54, 55, -1, 57, -- -1, 59, -1, -1, -1, -1, -1, -1, -1, 1, -- -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -- 12, -1, -1, 15, 16, -1, -1, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, -1, -- 7, 8, 100, 101, 11, 12, -1, 105, 15, 107, -- 108, 109, 44, 45, -1, 47, -1, 49, -1, -1, -- -1, -1, 54, 55, -1, 57, -1, 59, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -- 47, -1, -1, 75, 76, 77, 53, 54, 55, -1, -- 57, -1, 59, 85, 86, 87, 88, 89, 90, -1, -- -1, -1, 94, 95, 96, -1, -1, -1, 100, 101, -- 77, -1, -1, 105, -1, 107, 108, 109, 85, 86, -- 87, 88, 89, 90, -1, -1, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, 16, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, 16, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, 16, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, 16, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, -1, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, -1, 100, 101, -1, -1, -1, 105, -1, -- 107, 108, 109, 10, -1, 12, 13, 14, -1, -1, -- -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 10, -1, 12, -1, 14, 15, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, -1, 100, 101, -1, 44, 45, 105, 47, -- 107, 108, 109, -1, -1, -1, 54, 55, -1, 57, -- -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 10, -1, 12, -1, -1, 15, -1, -1, 77, -- -1, -1, -1, -1, -1, -1, -1, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, -1, -- -1, -1, 100, 101, -1, 44, 45, 105, 47, 107, -- 108, 109, -1, -1, -1, 54, 55, -1, 57, -1, -- 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 10, -1, 12, -1, -1, 15, -1, -1, 77, -1, -- -1, -1, -1, -1, -1, -1, 85, 86, 87, 88, -- 89, 90, -1, -1, -1, 94, 95, 96, -1, -1, -- -1, 100, 101, -1, 44, 45, 105, 47, 107, 108, -- 109, -1, -1, -1, 54, 55, -1, 57, -1, 59, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, -- -1, 12, -1, -1, 15, -1, -1, 77, -1, -1, -- -1, -1, -1, -1, -1, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, -1, -1, -1, -- 100, 101, -1, 44, 45, 105, 47, 107, 108, 109, -- -1, -1, -1, 54, 55, -1, 57, -1, 59, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, 10, -1, -- 12, -1, -1, 15, -1, -1, 77, -1, -1, -1, -- -1, -1, -1, -1, 85, 86, 87, 88, 89, 90, -- -1, -1, -1, 94, 95, 96, -1, -1, -1, 100, -- 101, -1, 44, 45, 105, 47, 107, 108, 109, -1, -- -1, -1, 54, 55, -1, 57, -1, 59, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 10, -1, 12, -- -1, -1, 15, -1, -1, 77, -1, -1, -1, -1, -- -1, -1, -1, 85, 86, 87, 88, 89, 90, -1, -- -1, -1, 94, 95, 96, -1, -1, -1, 100, 101, -- -1, 44, 45, 105, 47, 107, 108, 109, -1, -1, -- -1, 54, 55, -1, 57, -1, 59, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, 10, -1, 12, -1, -- -1, 15, -1, -1, 77, -1, -1, -1, -1, -1, -- -1, -1, 85, 86, 87, 88, 89, 90, -1, -1, -- -1, 94, 95, 96, -1, -1, -1, 100, 101, -1, -- 44, 45, 105, 47, 107, 108, 109, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, -1, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, -1, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, 93, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- 14, 105, -1, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, -1, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, -1, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, -1, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, 12, 13, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 23, -1, -- -1, 105, -1, 107, 108, 109, -1, -1, -1, -1, -- -1, -1, 37, 38, 39, 40, 41, 42, 43, 44, -- 45, -1, 47, -1, -1, -1, -1, -1, -1, 54, -- 55, -1, 57, -1, 59, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 77, -1, -1, -1, -1, -1, -1, -1, -- 85, 86, 87, 88, 89, 90, 12, 13, -1, 94, -- 95, 96, -1, -1, -1, 100, 101, 23, -1, -1, -- 105, -1, 107, 108, 109, -1, -1, -1, -1, -1, -- -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, -- -1, 47, -1, -1, -1, -1, -1, -1, 54, 55, -- -1, 57, -1, 59, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -- -1, 77, -1, -1, -1, -1, 23, -1, -1, 85, -- 86, 87, 88, 89, 90, -1, -1, 34, 35, 95, -- 96, -1, -1, -1, 100, 101, 43, 44, 45, 105, -- 47, 107, 108, 109, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, 12, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, 23, 92, 93, 94, 95, 96, -- -1, -1, -1, 100, 101, 34, 35, -1, 105, -1, -- 107, 108, 109, -1, 43, 44, 45, -1, 47, -1, -- -1, -1, -1, -1, -1, 54, 55, -1, 57, -1, -- 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 12, -1, -1, -1, -1, -1, 77, -1, -- -1, -1, -1, 23, -1, -1, 85, 86, 87, 88, -- 89, 90, -1, 92, 34, 94, 95, 96, -1, -1, -- -1, 100, 101, 43, 44, 45, 105, 47, 107, 108, -- 109, -1, -1, -1, 54, 55, -1, 57, -1, 59, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 12, -1, -1, 15, 16, -1, 77, -1, -1, -- -1, -1, -1, -1, -1, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, -1, -1, -1, -- 100, 101, -1, 44, 45, 105, 47, 107, 108, 109, -- -1, -1, -1, 54, 55, -1, 57, -1, 59, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 12, -1, -1, 15, 16, -1, 77, -1, -1, -1, -- -1, -1, -1, -1, 85, 86, 87, 88, 89, 90, -- -1, -1, -1, 94, 95, 96, -1, -1, -1, 100, -- 101, -1, 44, 45, 105, 47, 107, 108, 109, -1, -- -1, -1, 54, 55, -1, 57, -1, 59, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, -- -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, -- 23, -1, -1, 85, 86, 87, 88, 89, 90, -1, -- -1, -1, 94, 95, 96, -1, -1, -1, 100, 101, -- 43, 44, 45, 105, 47, 107, 108, 109, -1, -1, -- -1, 54, 55, -1, 57, -1, 59, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, 12, -1, -- -1, 15, -1, -1, 77, -1, -1, -1, -1, -1, -- -1, -1, 85, 86, 87, 88, 89, 90, -1, -1, -- -1, 94, 95, 96, -1, -1, -1, 100, 101, -1, -- 44, 45, 105, 47, 107, 108, 109, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 12, -1, -1, -- 15, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, -1, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, -1, 44, -- 45, 105, 47, 107, 108, 109, -1, -1, -1, 54, -- 55, -1, 57, -1, 59, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, 12, -1, -1, 15, -- -1, -1, 77, -1, -1, -1, -1, -1, -1, -1, -- 85, 86, 87, 88, 89, 90, -1, -1, -1, 94, -- 95, 96, -1, -1, -1, 100, 101, -1, 44, 45, -- 105, 47, 107, 108, 109, -1, -1, -1, 54, 55, -- -1, 57, -1, 59, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -- -1, 77, -1, -1, -1, -1, -1, -1, -1, 85, -- 86, 87, 88, 89, 90, -1, -1, -1, 94, 95, -- 96, -1, -1, -1, 100, 101, -1, 44, 45, 105, -- 47, 107, 108, 109, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, 68, -1, -1, 12, -1, -1, 15, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, -1, -1, 94, 95, 96, -- -1, -1, -1, 100, 101, -1, 44, 45, 105, 47, -- 107, 108, 109, -1, -1, -1, 54, 55, -1, 57, -- -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 12, -1, -1, -1, -1, -1, 77, -- -1, -1, -1, -1, 23, -1, -1, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, -1, -- -1, -1, 100, 101, 43, 44, 45, 105, 47, 107, -- 108, 109, -1, -1, -1, 54, 55, -1, 57, -1, -- 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 12, -1, -1, -1, -1, -1, 77, -1, -- -1, -1, -1, -1, -1, -1, 85, 86, 87, 88, -- 89, 90, -1, -1, -1, -1, 95, 96, -1, -1, -- -1, 100, 101, -1, 44, 45, 105, 47, 107, 108, -- 109, -1, -1, -1, 54, 55, -1, 57, -1, 59, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, -- -1, -1, -1, -1, -1, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, -1, -1, -1, -- 100, 101, -1, -1, -1, 105, -1, 107, 108, 109 --}; -- --/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing -- symbol of state STATE-NUM. */ --static const unsigned char yystos[] = --{ -- 0, 1, 10, 14, 112, 127, 129, 141, 0, 7, -- 8, 11, 12, 15, 44, 45, 47, 53, 54, 55, -- 57, 59, 77, 85, 86, 87, 88, 89, 90, 94, -- 95, 96, 100, 101, 105, 107, 108, 109, 124, 130, -- 131, 133, 136, 143, 144, 154, 155, 156, 158, 10, -- 14, 124, 124, 136, 137, 145, 12, 12, 105, 155, -- 156, 85, 88, 122, 12, 12, 12, 12, 41, 156, -- 12, 12, 155, 155, 143, 155, 156, 156, 155, 1, -- 10, 14, 46, 48, 49, 50, 51, 52, 56, 60, -- 61, 75, 76, 97, 98, 116, 118, 123, 124, 136, -- 140, 147, 149, 153, 159, 9, 124, 127, 13, 23, -- 34, 35, 37, 38, 39, 40, 41, 42, 43, 92, -- 113, 114, 155, 12, 15, 100, 101, 102, 103, 106, -- 68, 107, 108, 18, 153, 153, 9, 16, 115, 16, -- 115, 91, 16, 134, 136, 136, 12, 136, 136, 134, -- 16, 134, 155, 41, 136, 136, 10, 125, 126, 14, -- 125, 148, 148, 158, 136, 148, 12, 12, 148, 148, -- 136, 148, 12, 10, 150, 149, 153, 12, 135, 138, -- 139, 143, 155, 156, 148, 17, 149, 152, 130, 153, -- 131, 94, 136, 144, 136, 136, 136, 136, 136, 136, -- 158, 136, 10, 136, 10, 136, 136, 144, 68, 155, -- 155, 155, 155, 155, 155, 136, 134, 17, 17, 10, -- 136, 43, 136, 15, 16, 115, 85, 157, 115, 115, -- 16, 16, 155, 115, 115, 10, 126, 18, 148, 128, -- 147, 158, 136, 148, 136, 149, 78, 117, 17, 142, -- 137, 23, 43, 92, 113, 114, 155, 115, 13, 36, -- 39, 68, 149, 124, 17, 156, 93, 115, 115, 155, -- 19, 158, 136, 16, 115, 146, 136, 144, 136, 144, -- 136, 158, 134, 14, 43, 146, 146, 151, 10, 149, -- 10, 16, 12, 135, 144, 158, 135, 135, 135, 135, -- 155, 155, 155, 135, 153, 136, 136, 136, 85, 10, -- 132, 16, 16, 16, 16, 16, 115, 16, 115, 19, -- 14, 126, 158, 98, 43, 137, 93, 17, 16, 115, -- 16, 115, 124, 136, 136, 144, 126, 136, 146, 12, -- 158, 16, 135, 156, 156, 153, 16, 16, 16, 128, -- 14, 121, 136, 16, 16, 17, 146, 126, 149, 16, -- 120, 128, 148, 149, 146, 119, 149 --}; -- --#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) --# define YYSIZE_T __SIZE_TYPE__ --#endif --#if ! defined (YYSIZE_T) && defined (size_t) --# define YYSIZE_T size_t --#endif --#if ! defined (YYSIZE_T) --# if defined (__STDC__) || defined (__cplusplus) --# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ --# define YYSIZE_T size_t --# endif --#endif --#if ! defined (YYSIZE_T) --# define YYSIZE_T unsigned int --#endif -- --#define yyerrok (yyerrstatus = 0) --#define yyclearin (yychar = YYEMPTY) --#define YYEMPTY (-2) --#define YYEOF 0 -- --#define YYACCEPT goto yyacceptlab --#define YYABORT goto yyabortlab --#define YYERROR goto yyerrlab1 -- --/* Like YYERROR except do call yyerror. This remains here temporarily -- to ease the transition to the new meaning of YYERROR, for GCC. -- Once GCC version 2 has supplanted version 1, this can go. */ -- --#define YYFAIL goto yyerrlab -- --#define YYRECOVERING() (!!yyerrstatus) -- --#define YYBACKUP(Token, Value) \ --do \ -- if (yychar == YYEMPTY && yylen == 1) \ -- { \ -- yychar = (Token); \ -- yylval = (Value); \ -- yytoken = YYTRANSLATE (yychar); \ -- YYPOPSTACK; \ -- goto yybackup; \ -- } \ -- else \ -- { \ -- yyerror ("syntax error: cannot back up");\ -- YYERROR; \ -- } \ --while (0) -- --#define YYTERROR 1 --#define YYERRCODE 256 -- --/* YYLLOC_DEFAULT -- Compute the default location (before the actions -- are run). */ -- --#ifndef YYLLOC_DEFAULT --# define YYLLOC_DEFAULT(Current, Rhs, N) \ -- Current.first_line = Rhs[1].first_line; \ -- Current.first_column = Rhs[1].first_column; \ -- Current.last_line = Rhs[N].last_line; \ -- Current.last_column = Rhs[N].last_column; --#endif -- --/* YYLEX -- calling `yylex' with the right arguments. */ -- --#ifdef YYLEX_PARAM --# define YYLEX yylex (YYLEX_PARAM) --#else --# define YYLEX yylex () --#endif -- --/* Enable debugging if requested. */ --#if YYDEBUG -- --# ifndef YYFPRINTF --# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ --# define YYFPRINTF fprintf --# endif -- --# define YYDPRINTF(Args) \ --do { \ -- if (yydebug) \ -- YYFPRINTF Args; \ --} while (0) -- --# define YYDSYMPRINT(Args) \ --do { \ -- if (yydebug) \ -- yysymprint Args; \ --} while (0) -- --# define YYDSYMPRINTF(Title, Token, Value, Location) \ --do { \ -- if (yydebug) \ -- { \ -- YYFPRINTF (stderr, "%s ", Title); \ -- yysymprint (stderr, \ -- Token, Value); \ -- YYFPRINTF (stderr, "\n"); \ -- } \ --} while (0) -- --/*------------------------------------------------------------------. --| yy_stack_print -- Print the state stack from its BOTTOM up to its | --| TOP (cinluded). | --`------------------------------------------------------------------*/ -- --#if defined (__STDC__) || defined (__cplusplus) --static void --yy_stack_print (short *bottom, short *top) --#else --static void --yy_stack_print (bottom, top) -- short *bottom; -- short *top; --#endif --{ -- YYFPRINTF (stderr, "Stack now"); -- for (/* Nothing. */; bottom <= top; ++bottom) -- YYFPRINTF (stderr, " %d", *bottom); -- YYFPRINTF (stderr, "\n"); --} -- --# define YY_STACK_PRINT(Bottom, Top) \ --do { \ -- if (yydebug) \ -- yy_stack_print ((Bottom), (Top)); \ --} while (0) -- -- --/*------------------------------------------------. --| Report that the YYRULE is going to be reduced. | --`------------------------------------------------*/ -- --#if defined (__STDC__) || defined (__cplusplus) --static void --yy_reduce_print (int yyrule) --#else --static void --yy_reduce_print (yyrule) -- int yyrule; --#endif --{ -- int yyi; -- unsigned int yylineno = yyrline[yyrule]; -- YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", -- yyrule - 1, yylineno); -- /* Print the symbols being reduced, and their result. */ -- for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) -- YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); -- YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); --} -- --# define YY_REDUCE_PRINT(Rule) \ --do { \ -- if (yydebug) \ -- yy_reduce_print (Rule); \ --} while (0) -- --/* Nonzero means print parse trace. It is left uninitialized so that -- multiple parsers can coexist. */ --int yydebug; --#else /* !YYDEBUG */ --# define YYDPRINTF(Args) --# define YYDSYMPRINT(Args) --# define YYDSYMPRINTF(Title, Token, Value, Location) --# define YY_STACK_PRINT(Bottom, Top) --# define YY_REDUCE_PRINT(Rule) --#endif /* !YYDEBUG */ -- -- --/* YYINITDEPTH -- initial size of the parser's stacks. */ --#ifndef YYINITDEPTH --# define YYINITDEPTH 200 --#endif -- --/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only -- if the built-in stack extension method is used). -- -- Do not make this value too large; the results are undefined if -- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) -- evaluated with infinite-precision integer arithmetic. */ -- --#if YYMAXDEPTH == 0 --# undef YYMAXDEPTH --#endif -- --#ifndef YYMAXDEPTH --# define YYMAXDEPTH 10000 --#endif -- -- -- --#if YYERROR_VERBOSE -- --# ifndef yystrlen --# if defined (__GLIBC__) && defined (_STRING_H) --# define yystrlen strlen --# else --/* Return the length of YYSTR. */ --static YYSIZE_T --# if defined (__STDC__) || defined (__cplusplus) --yystrlen (const char *yystr) --# else --yystrlen (yystr) -- const char *yystr; --# endif --{ -- register const char *yys = yystr; -- -- while (*yys++ != '\0') -- continue; -- -- return yys - yystr - 1; --} --# endif --# endif -- --# ifndef yystpcpy --# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) --# define yystpcpy stpcpy --# else --/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in -- YYDEST. */ --static char * --# if defined (__STDC__) || defined (__cplusplus) --yystpcpy (char *yydest, const char *yysrc) --# else --yystpcpy (yydest, yysrc) -- char *yydest; -- const char *yysrc; --# endif --{ -- register char *yyd = yydest; -- register const char *yys = yysrc; -- -- while ((*yyd++ = *yys++) != '\0') -- continue; -- -- return yyd - 1; --} --# endif --# endif -- --#endif /* !YYERROR_VERBOSE */ -- -- -- --#if YYDEBUG --/*--------------------------------. --| Print this symbol on YYOUTPUT. | --`--------------------------------*/ -- --#if defined (__STDC__) || defined (__cplusplus) --static void --yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) --#else --static void --yysymprint (yyoutput, yytype, yyvaluep) -- FILE *yyoutput; -- int yytype; -- YYSTYPE *yyvaluep; --#endif --{ -- /* Pacify ``unused variable'' warnings. */ -- (void) yyvaluep; -- -- if (yytype < YYNTOKENS) -- { -- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); --# ifdef YYPRINT -- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); --# endif -- } -- else -- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); -- -- switch (yytype) -- { -- default: -- break; -- } -- YYFPRINTF (yyoutput, ")"); --} -- --#endif /* ! YYDEBUG */ --/*-----------------------------------------------. --| Release the memory associated to this symbol. | --`-----------------------------------------------*/ -- --#if defined (__STDC__) || defined (__cplusplus) --static void --yydestruct (int yytype, YYSTYPE *yyvaluep) --#else --static void --yydestruct (yytype, yyvaluep) -- int yytype; -- YYSTYPE *yyvaluep; --#endif --{ -- /* Pacify ``unused variable'' warnings. */ -- (void) yyvaluep; -- -- switch (yytype) -- { -- -- default: -- break; -- } --} -- -- --/* Prevent warnings from -Wmissing-prototypes. */ -- --#ifdef YYPARSE_PARAM --# if defined (__STDC__) || defined (__cplusplus) --int yyparse (void *YYPARSE_PARAM); --# else --int yyparse (); --# endif --#else /* ! YYPARSE_PARAM */ --#if defined (__STDC__) || defined (__cplusplus) --int yyparse (void); --#else --int yyparse (); --#endif --#endif /* ! YYPARSE_PARAM */ -- -- -- --/* The lookahead symbol. */ --int yychar; -- --/* The semantic value of the lookahead symbol. */ --YYSTYPE yylval; -- --/* Number of syntax errors so far. */ --int yynerrs; -- -- -- --/*----------. --| yyparse. | --`----------*/ -- --#ifdef YYPARSE_PARAM --# if defined (__STDC__) || defined (__cplusplus) --int yyparse (void *YYPARSE_PARAM) --# else --int yyparse (YYPARSE_PARAM) -- void *YYPARSE_PARAM; --# endif --#else /* ! YYPARSE_PARAM */ --#if defined (__STDC__) || defined (__cplusplus) --int --yyparse (void) --#else --int --yyparse () -- --#endif --#endif --{ -- -- register int yystate; -- register int yyn; -- int yyresult; -- /* Number of tokens to shift before error messages enabled. */ -- int yyerrstatus; -- /* Lookahead token as an internal (translated) token number. */ -- int yytoken = 0; -- -- /* Three stacks and their tools: -- `yyss': related to states, -- `yyvs': related to semantic values, -- `yyls': related to locations. -- -- Refer to the stacks thru separate pointers, to allow yyoverflow -- to reallocate them elsewhere. */ -- -- /* The state stack. */ -- short yyssa[YYINITDEPTH]; -- short *yyss = yyssa; -- register short *yyssp; -- -- /* The semantic value stack. */ -- YYSTYPE yyvsa[YYINITDEPTH]; -- YYSTYPE *yyvs = yyvsa; -- register YYSTYPE *yyvsp; -- -- -- --#define YYPOPSTACK (yyvsp--, yyssp--) -- -- YYSIZE_T yystacksize = YYINITDEPTH; -- -- /* The variables used to return semantic value and location from the -- action routines. */ -- YYSTYPE yyval; -- -- -- /* When reducing, the number of symbols on the RHS of the reduced -- rule. */ -- int yylen; -- -- YYDPRINTF ((stderr, "Starting parse\n")); -- -- yystate = 0; -- yyerrstatus = 0; -- yynerrs = 0; -- yychar = YYEMPTY; /* Cause a token to be read. */ -- -- /* Initialize stack pointers. -- Waste one element of value and location stack -- so that they stay on the same level as the state stack. -- The wasted elements are never initialized. */ -- -- yyssp = yyss; -- yyvsp = yyvs; -- -- goto yysetstate; -- --/*------------------------------------------------------------. --| yynewstate -- Push a new state, which is found in yystate. | --`------------------------------------------------------------*/ -- yynewstate: -- /* In all cases, when you get here, the value and location stacks -- have just been pushed. so pushing a state here evens the stacks. -- */ -- yyssp++; -- -- yysetstate: -- *yyssp = yystate; -- -- if (yyss + yystacksize - 1 <= yyssp) -- { -- /* Get the current used size of the three stacks, in elements. */ -- YYSIZE_T yysize = yyssp - yyss + 1; -- --#ifdef yyoverflow -- { -- /* Give user a chance to reallocate the stack. Use copies of -- these so that the &'s don't force the real ones into -- memory. */ -- YYSTYPE *yyvs1 = yyvs; -- short *yyss1 = yyss; -- -- -- /* Each stack pointer address is followed by the size of the -- data in use in that stack, in bytes. This used to be a -- conditional around just the two extra args, but that might -- be undefined if yyoverflow is a macro. */ -- yyoverflow ("parser stack overflow", -- &yyss1, yysize * sizeof (*yyssp), -- &yyvs1, yysize * sizeof (*yyvsp), -- -- &yystacksize); -- -- yyss = yyss1; -- yyvs = yyvs1; -- } --#else /* no yyoverflow */ --# ifndef YYSTACK_RELOCATE -- goto yyoverflowlab; --# else -- /* Extend the stack our own way. */ -- if (YYMAXDEPTH <= yystacksize) -- goto yyoverflowlab; -- yystacksize *= 2; -- if (YYMAXDEPTH < yystacksize) -- yystacksize = YYMAXDEPTH; -- -- { -- short *yyss1 = yyss; -- union yyalloc *yyptr = -- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); -- if (! yyptr) -- goto yyoverflowlab; -- YYSTACK_RELOCATE (yyss); -- YYSTACK_RELOCATE (yyvs); -- --# undef YYSTACK_RELOCATE -- if (yyss1 != yyssa) -- YYSTACK_FREE (yyss1); -- } --# endif --#endif /* no yyoverflow */ -- -- yyssp = yyss + yysize - 1; -- yyvsp = yyvs + yysize - 1; -- -- -- YYDPRINTF ((stderr, "Stack size increased to %lu\n", -- (unsigned long int) yystacksize)); -- -- if (yyss + yystacksize - 1 <= yyssp) -- YYABORT; -- } -- -- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); -- -- goto yybackup; -- --/*-----------. --| yybackup. | --`-----------*/ --yybackup: -- --/* Do appropriate processing given the current state. */ --/* Read a lookahead token if we need one and don't already have one. */ --/* yyresume: */ -- -- /* First try to decide what to do without reference to lookahead token. */ -- -- yyn = yypact[yystate]; -- if (yyn == YYPACT_NINF) -- goto yydefault; -- -- /* Not known => get a lookahead token if don't already have one. */ -- -- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ -- if (yychar == YYEMPTY) -- { -- YYDPRINTF ((stderr, "Reading a token: ")); -- yychar = YYLEX; -- } -- -- if (yychar <= YYEOF) -- { -- yychar = yytoken = YYEOF; -- YYDPRINTF ((stderr, "Now at end of input.\n")); -- } -- else -- { -- yytoken = YYTRANSLATE (yychar); -- YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); -- } -- -- /* If the proper action on seeing token YYTOKEN is to reduce or to -- detect an error, take that action. */ -- yyn += yytoken; -- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) -- goto yydefault; -- yyn = yytable[yyn]; -- if (yyn <= 0) -- { -- if (yyn == 0 || yyn == YYTABLE_NINF) -- goto yyerrlab; -- yyn = -yyn; -- goto yyreduce; -- } -- -- if (yyn == YYFINAL) -- YYACCEPT; -- -- /* Shift the lookahead token. */ -- YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); -- -- /* Discard the token being shifted unless it is eof. */ -- if (yychar != YYEOF) -- yychar = YYEMPTY; -- -- *++yyvsp = yylval; -- -- -- /* Count tokens shifted since error; after three, turn off error -- status. */ -- if (yyerrstatus) -- yyerrstatus--; -- -- yystate = yyn; -- goto yynewstate; -- -- --/*-----------------------------------------------------------. --| yydefault -- do the default action for the current state. | --`-----------------------------------------------------------*/ --yydefault: -- yyn = yydefact[yystate]; -- if (yyn == 0) -- goto yyerrlab; -- goto yyreduce; -- -- --/*-----------------------------. --| yyreduce -- Do a reduction. | --`-----------------------------*/ --yyreduce: -- /* yyn is the number of a rule to reduce with. */ -- yylen = yyr2[yyn]; -- -- /* If YYLEN is nonzero, implement the default value of the action: -- `$$ = $1'. -- -- Otherwise, the following line sets YYVAL to garbage. -- This behavior is undocumented and Bison -- users should not rely upon it. Assigning to YYVAL -- unconditionally makes the parser a bit smaller, and it avoids a -- GCC warning that YYVAL may be used uninitialized. */ -- yyval = yyvsp[1-yylen]; -- -- -- YY_REDUCE_PRINT (yyn); -- switch (yyn) -- { -- case 2: --#line 98 "awkgram.y" -- { if (errorflag==0) -- winner = (Node *)stat3(PROGRAM, beginloc, yyvsp[0].p, endloc); } -- break; -- -- case 3: --#line 100 "awkgram.y" -- { yyclearin; bracecheck(); SYNTAX("bailing out"); } -- break; -- -- case 14: --#line 124 "awkgram.y" -- {inloop++;} -- break; -- -- case 15: --#line 125 "awkgram.y" -- { --inloop; yyval.p = stat4(FOR, yyvsp[-9].p, notnull(yyvsp[-6].p), yyvsp[-3].p, yyvsp[0].p); } -- break; -- -- case 16: --#line 126 "awkgram.y" -- {inloop++;} -- break; -- -- case 17: --#line 127 "awkgram.y" -- { --inloop; yyval.p = stat4(FOR, yyvsp[-7].p, NIL, yyvsp[-3].p, yyvsp[0].p); } -- break; -- -- case 18: --#line 128 "awkgram.y" -- {inloop++;} -- break; -- -- case 19: --#line 129 "awkgram.y" -- { --inloop; yyval.p = stat3(IN, yyvsp[-5].p, makearr(yyvsp[-3].p), yyvsp[0].p); } -- break; -- -- case 20: --#line 133 "awkgram.y" -- { setfname(yyvsp[0].cp); } -- break; -- -- case 21: --#line 134 "awkgram.y" -- { setfname(yyvsp[0].cp); } -- break; -- -- case 22: --#line 138 "awkgram.y" -- { yyval.p = notnull(yyvsp[-1].p); } -- break; -- -- case 27: --#line 150 "awkgram.y" -- { yyval.i = 0; } -- break; -- -- case 29: --#line 155 "awkgram.y" -- { yyval.i = 0; } -- break; -- -- case 31: --#line 161 "awkgram.y" -- { yyval.p = 0; } -- break; -- -- case 33: --#line 166 "awkgram.y" -- { yyval.p = 0; } -- break; -- -- case 34: --#line 167 "awkgram.y" -- { yyval.p = yyvsp[-1].p; } -- break; -- -- case 35: --#line 171 "awkgram.y" -- { yyval.p = notnull(yyvsp[0].p); } -- break; -- -- case 36: --#line 175 "awkgram.y" -- { yyval.p = stat2(PASTAT, yyvsp[0].p, stat2(PRINT, rectonode(), NIL)); } -- break; -- -- case 37: --#line 176 "awkgram.y" -- { yyval.p = stat2(PASTAT, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 38: --#line 177 "awkgram.y" -- { yyval.p = pa2stat(yyvsp[-2].p, yyvsp[0].p, stat2(PRINT, rectonode(), NIL)); } -- break; -- -- case 39: --#line 178 "awkgram.y" -- { yyval.p = pa2stat(yyvsp[-5].p, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 40: --#line 179 "awkgram.y" -- { yyval.p = stat2(PASTAT, NIL, yyvsp[-1].p); } -- break; -- -- case 41: --#line 181 "awkgram.y" -- { beginloc = linkum(beginloc, yyvsp[-1].p); yyval.p = 0; } -- break; -- -- case 42: --#line 183 "awkgram.y" -- { endloc = linkum(endloc, yyvsp[-1].p); yyval.p = 0; } -- break; -- -- case 43: --#line 184 "awkgram.y" -- {infunc++;} -- break; -- -- case 44: --#line 185 "awkgram.y" -- { infunc--; curfname=0; defn((Cell *)yyvsp[-7].p, yyvsp[-5].p, yyvsp[-1].p); yyval.p = 0; } -- break; -- -- case 46: --#line 190 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 48: --#line 195 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 49: --#line 199 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 50: --#line 201 "awkgram.y" -- { yyval.p = op3(CONDEXPR, notnull(yyvsp[-4].p), yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 51: --#line 203 "awkgram.y" -- { yyval.p = op2(BOR, notnull(yyvsp[-2].p), notnull(yyvsp[0].p)); } -- break; -- -- case 52: --#line 205 "awkgram.y" -- { yyval.p = op2(AND, notnull(yyvsp[-2].p), notnull(yyvsp[0].p)); } -- break; -- -- case 53: --#line 206 "awkgram.y" -- { yyval.p = op3(yyvsp[-1].i, NIL, yyvsp[-2].p, (Node*)makedfa(yyvsp[0].s, 0)); } -- break; -- -- case 54: --#line 208 "awkgram.y" -- { if (constnode(yyvsp[0].p)) -- yyval.p = op3(yyvsp[-1].i, NIL, yyvsp[-2].p, (Node*)makedfa(strnode(yyvsp[0].p), 0)); -- else -- yyval.p = op3(yyvsp[-1].i, (Node *)1, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 55: --#line 212 "awkgram.y" -- { yyval.p = op2(INTEST, yyvsp[-2].p, makearr(yyvsp[0].p)); } -- break; -- -- case 56: --#line 213 "awkgram.y" -- { yyval.p = op2(INTEST, yyvsp[-3].p, makearr(yyvsp[0].p)); } -- break; -- -- case 57: --#line 214 "awkgram.y" -- { yyval.p = op2(CAT, yyvsp[-1].p, yyvsp[0].p); } -- break; -- -- case 60: --#line 220 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 61: --#line 222 "awkgram.y" -- { yyval.p = op3(CONDEXPR, notnull(yyvsp[-4].p), yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 62: --#line 224 "awkgram.y" -- { yyval.p = op2(BOR, notnull(yyvsp[-2].p), notnull(yyvsp[0].p)); } -- break; -- -- case 63: --#line 226 "awkgram.y" -- { yyval.p = op2(AND, notnull(yyvsp[-2].p), notnull(yyvsp[0].p)); } -- break; -- -- case 64: --#line 227 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 65: --#line 228 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 66: --#line 229 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 67: --#line 230 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 68: --#line 231 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 69: --#line 232 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 70: --#line 233 "awkgram.y" -- { yyval.p = op3(yyvsp[-1].i, NIL, yyvsp[-2].p, (Node*)makedfa(yyvsp[0].s, 0)); } -- break; -- -- case 71: --#line 235 "awkgram.y" -- { if (constnode(yyvsp[0].p)) -- yyval.p = op3(yyvsp[-1].i, NIL, yyvsp[-2].p, (Node*)makedfa(strnode(yyvsp[0].p), 0)); -- else -- yyval.p = op3(yyvsp[-1].i, (Node *)1, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 72: --#line 239 "awkgram.y" -- { yyval.p = op2(INTEST, yyvsp[-2].p, makearr(yyvsp[0].p)); } -- break; -- -- case 73: --#line 240 "awkgram.y" -- { yyval.p = op2(INTEST, yyvsp[-3].p, makearr(yyvsp[0].p)); } -- break; -- -- case 74: --#line 241 "awkgram.y" -- { -- if (safe) SYNTAX("cmd | getline is unsafe"); -- else yyval.p = op3(GETLINE, yyvsp[0].p, itonp(yyvsp[-2].i), yyvsp[-3].p); } -- break; -- -- case 75: --#line 244 "awkgram.y" -- { -- if (safe) SYNTAX("cmd | getline is unsafe"); -- else yyval.p = op3(GETLINE, (Node*)0, itonp(yyvsp[-1].i), yyvsp[-2].p); } -- break; -- -- case 76: --#line 247 "awkgram.y" -- { yyval.p = op2(CAT, yyvsp[-1].p, yyvsp[0].p); } -- break; -- -- case 79: --#line 253 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 80: --#line 254 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 82: --#line 259 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 83: --#line 263 "awkgram.y" -- { yyval.p = rectonode(); } -- break; -- -- case 85: --#line 265 "awkgram.y" -- { yyval.p = yyvsp[-1].p; } -- break; -- -- case 94: --#line 282 "awkgram.y" -- { yyval.p = op3(MATCH, NIL, rectonode(), (Node*)makedfa(yyvsp[0].s, 0)); } -- break; -- -- case 95: --#line 283 "awkgram.y" -- { yyval.p = op1(NOT, notnull(yyvsp[0].p)); } -- break; -- -- case 96: --#line 287 "awkgram.y" -- {startreg();} -- break; -- -- case 97: --#line 287 "awkgram.y" -- { yyval.s = yyvsp[-1].s; } -- break; -- -- case 100: --#line 295 "awkgram.y" -- { -- if (safe) SYNTAX("print | is unsafe"); -- else yyval.p = stat3(yyvsp[-3].i, yyvsp[-2].p, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 101: --#line 298 "awkgram.y" -- { -- if (safe) SYNTAX("print >> is unsafe"); -- else yyval.p = stat3(yyvsp[-3].i, yyvsp[-2].p, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 102: --#line 301 "awkgram.y" -- { -- if (safe) SYNTAX("print > is unsafe"); -- else yyval.p = stat3(yyvsp[-3].i, yyvsp[-2].p, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 103: --#line 304 "awkgram.y" -- { yyval.p = stat3(yyvsp[-1].i, yyvsp[0].p, NIL, NIL); } -- break; -- -- case 104: --#line 305 "awkgram.y" -- { yyval.p = stat2(DELETE, makearr(yyvsp[-3].p), yyvsp[-1].p); } -- break; -- -- case 105: --#line 306 "awkgram.y" -- { yyval.p = stat2(DELETE, makearr(yyvsp[0].p), 0); } -- break; -- -- case 106: --#line 307 "awkgram.y" -- { yyval.p = exptostat(yyvsp[0].p); } -- break; -- -- case 107: --#line 308 "awkgram.y" -- { yyclearin; SYNTAX("illegal statement"); } -- break; -- -- case 110: --#line 317 "awkgram.y" -- { if (!inloop) SYNTAX("break illegal outside of loops"); -- yyval.p = stat1(BREAK, NIL); } -- break; -- -- case 111: --#line 319 "awkgram.y" -- { if (!inloop) SYNTAX("continue illegal outside of loops"); -- yyval.p = stat1(CONTINUE, NIL); } -- break; -- -- case 112: --#line 321 "awkgram.y" -- {inloop++;} -- break; -- -- case 113: --#line 321 "awkgram.y" -- {--inloop;} -- break; -- -- case 114: --#line 322 "awkgram.y" -- { yyval.p = stat2(DO, yyvsp[-6].p, notnull(yyvsp[-2].p)); } -- break; -- -- case 115: --#line 323 "awkgram.y" -- { yyval.p = stat1(EXIT, yyvsp[-1].p); } -- break; -- -- case 116: --#line 324 "awkgram.y" -- { yyval.p = stat1(EXIT, NIL); } -- break; -- -- case 118: --#line 326 "awkgram.y" -- { yyval.p = stat3(IF, yyvsp[-3].p, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 119: --#line 327 "awkgram.y" -- { yyval.p = stat3(IF, yyvsp[-1].p, yyvsp[0].p, NIL); } -- break; -- -- case 120: --#line 328 "awkgram.y" -- { yyval.p = yyvsp[-1].p; } -- break; -- -- case 121: --#line 329 "awkgram.y" -- { if (infunc) -- SYNTAX("next is illegal inside a function"); -- yyval.p = stat1(NEXT, NIL); } -- break; -- -- case 122: --#line 332 "awkgram.y" -- { if (infunc) -- SYNTAX("nextfile is illegal inside a function"); -- yyval.p = stat1(NEXTFILE, NIL); } -- break; -- -- case 123: --#line 335 "awkgram.y" -- { yyval.p = stat1(RETURN, yyvsp[-1].p); } -- break; -- -- case 124: --#line 336 "awkgram.y" -- { yyval.p = stat1(RETURN, NIL); } -- break; -- -- case 126: --#line 338 "awkgram.y" -- {inloop++;} -- break; -- -- case 127: --#line 338 "awkgram.y" -- { --inloop; yyval.p = stat2(WHILE, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 128: --#line 339 "awkgram.y" -- { yyval.p = 0; } -- break; -- -- case 130: --#line 344 "awkgram.y" -- { yyval.p = linkum(yyvsp[-1].p, yyvsp[0].p); } -- break; -- -- case 133: --#line 352 "awkgram.y" -- { yyval.p = op2(DIVEQ, yyvsp[-3].p, yyvsp[0].p); } -- break; -- -- case 134: --#line 353 "awkgram.y" -- { yyval.p = op2(ADD, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 135: --#line 354 "awkgram.y" -- { yyval.p = op2(MINUS, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 136: --#line 355 "awkgram.y" -- { yyval.p = op2(MULT, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 137: --#line 356 "awkgram.y" -- { yyval.p = op2(DIVIDE, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 138: --#line 357 "awkgram.y" -- { yyval.p = op2(MOD, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 139: --#line 358 "awkgram.y" -- { yyval.p = op2(POWER, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 140: --#line 359 "awkgram.y" -- { yyval.p = op1(UMINUS, yyvsp[0].p); } -- break; -- -- case 141: --#line 360 "awkgram.y" -- { yyval.p = yyvsp[0].p; } -- break; -- -- case 142: --#line 361 "awkgram.y" -- { yyval.p = op1(NOT, notnull(yyvsp[0].p)); } -- break; -- -- case 143: --#line 362 "awkgram.y" -- { yyval.p = op2(BLTIN, itonp(yyvsp[-2].i), rectonode()); } -- break; -- -- case 144: --#line 363 "awkgram.y" -- { yyval.p = op2(BLTIN, itonp(yyvsp[-3].i), yyvsp[-1].p); } -- break; -- -- case 145: --#line 364 "awkgram.y" -- { yyval.p = op2(BLTIN, itonp(yyvsp[0].i), rectonode()); } -- break; -- -- case 146: --#line 365 "awkgram.y" -- { yyval.p = op2(CALL, celltonode(yyvsp[-2].cp,CVAR), NIL); } -- break; -- -- case 147: --#line 366 "awkgram.y" -- { yyval.p = op2(CALL, celltonode(yyvsp[-3].cp,CVAR), yyvsp[-1].p); } -- break; -- -- case 148: --#line 367 "awkgram.y" -- { yyval.p = op1(CLOSE, yyvsp[0].p); } -- break; -- -- case 149: --#line 368 "awkgram.y" -- { yyval.p = op1(PREDECR, yyvsp[0].p); } -- break; -- -- case 150: --#line 369 "awkgram.y" -- { yyval.p = op1(PREINCR, yyvsp[0].p); } -- break; -- -- case 151: --#line 370 "awkgram.y" -- { yyval.p = op1(POSTDECR, yyvsp[-1].p); } -- break; -- -- case 152: --#line 371 "awkgram.y" -- { yyval.p = op1(POSTINCR, yyvsp[-1].p); } -- break; -- -- case 153: --#line 372 "awkgram.y" -- { yyval.p = op3(GETLINE, yyvsp[-2].p, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 154: --#line 373 "awkgram.y" -- { yyval.p = op3(GETLINE, NIL, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 155: --#line 374 "awkgram.y" -- { yyval.p = op3(GETLINE, yyvsp[0].p, NIL, NIL); } -- break; -- -- case 156: --#line 375 "awkgram.y" -- { yyval.p = op3(GETLINE, NIL, NIL, NIL); } -- break; -- -- case 157: --#line 377 "awkgram.y" -- { yyval.p = op2(INDEX, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 158: --#line 379 "awkgram.y" -- { SYNTAX("index() doesn't permit regular expressions"); -- yyval.p = op2(INDEX, yyvsp[-3].p, (Node*)yyvsp[-1].s); } -- break; -- -- case 159: --#line 381 "awkgram.y" -- { yyval.p = yyvsp[-1].p; } -- break; -- -- case 160: --#line 383 "awkgram.y" -- { yyval.p = op3(MATCHFCN, NIL, yyvsp[-3].p, (Node*)makedfa(yyvsp[-1].s, 1)); } -- break; -- -- case 161: --#line 385 "awkgram.y" -- { if (constnode(yyvsp[-1].p)) -- yyval.p = op3(MATCHFCN, NIL, yyvsp[-3].p, (Node*)makedfa(strnode(yyvsp[-1].p), 1)); -- else -- yyval.p = op3(MATCHFCN, (Node *)1, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 162: --#line 389 "awkgram.y" -- { yyval.p = celltonode(yyvsp[0].cp, CCON); } -- break; -- -- case 163: --#line 391 "awkgram.y" -- { yyval.p = op4(SPLIT, yyvsp[-5].p, makearr(yyvsp[-3].p), yyvsp[-1].p, (Node*)STRING); } -- break; -- -- case 164: --#line 393 "awkgram.y" -- { yyval.p = op4(SPLIT, yyvsp[-5].p, makearr(yyvsp[-3].p), (Node*)makedfa(yyvsp[-1].s, 1), (Node *)REGEXPR); } -- break; -- -- case 165: --#line 395 "awkgram.y" -- { yyval.p = op4(SPLIT, yyvsp[-3].p, makearr(yyvsp[-1].p), NIL, (Node*)STRING); } -- break; -- -- case 166: --#line 396 "awkgram.y" -- { yyval.p = op1(yyvsp[-3].i, yyvsp[-1].p); } -- break; -- -- case 167: --#line 397 "awkgram.y" -- { yyval.p = celltonode(yyvsp[0].cp, CCON); } -- break; -- -- case 168: --#line 399 "awkgram.y" -- { yyval.p = op4(yyvsp[-5].i, NIL, (Node*)makedfa(yyvsp[-3].s, 1), yyvsp[-1].p, rectonode()); } -- break; -- -- case 169: --#line 401 "awkgram.y" -- { if (constnode(yyvsp[-3].p)) -- yyval.p = op4(yyvsp[-5].i, NIL, (Node*)makedfa(strnode(yyvsp[-3].p), 1), yyvsp[-1].p, rectonode()); -- else -- yyval.p = op4(yyvsp[-5].i, (Node *)1, yyvsp[-3].p, yyvsp[-1].p, rectonode()); } -- break; -- -- case 170: --#line 406 "awkgram.y" -- { yyval.p = op4(yyvsp[-7].i, NIL, (Node*)makedfa(yyvsp[-5].s, 1), yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 171: --#line 408 "awkgram.y" -- { if (constnode(yyvsp[-5].p)) -- yyval.p = op4(yyvsp[-7].i, NIL, (Node*)makedfa(strnode(yyvsp[-5].p), 1), yyvsp[-3].p, yyvsp[-1].p); -- else -- yyval.p = op4(yyvsp[-7].i, (Node *)1, yyvsp[-5].p, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 172: --#line 413 "awkgram.y" -- { yyval.p = op3(SUBSTR, yyvsp[-5].p, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 173: --#line 415 "awkgram.y" -- { yyval.p = op3(SUBSTR, yyvsp[-3].p, yyvsp[-1].p, NIL); } -- break; -- -- case 176: --#line 421 "awkgram.y" -- { yyval.p = op2(ARRAY, makearr(yyvsp[-3].p), yyvsp[-1].p); } -- break; -- -- case 177: --#line 422 "awkgram.y" -- { yyval.p = op1(INDIRECT, celltonode(yyvsp[0].cp, CVAR)); } -- break; -- -- case 178: --#line 423 "awkgram.y" -- { yyval.p = op1(INDIRECT, yyvsp[0].p); } -- break; -- -- case 179: --#line 427 "awkgram.y" -- { arglist = yyval.p = 0; } -- break; -- -- case 180: --#line 428 "awkgram.y" -- { arglist = yyval.p = celltonode(yyvsp[0].cp,CVAR); } -- break; -- -- case 181: --#line 429 "awkgram.y" -- { -- checkdup(yyvsp[-2].p, yyvsp[0].cp); -- arglist = yyval.p = linkum(yyvsp[-2].p,celltonode(yyvsp[0].cp,CVAR)); } -- break; -- -- case 182: --#line 435 "awkgram.y" -- { yyval.p = celltonode(yyvsp[0].cp, CVAR); } -- break; -- -- case 183: --#line 436 "awkgram.y" -- { yyval.p = op1(ARG, itonp(yyvsp[0].i)); } -- break; -- -- case 184: --#line 437 "awkgram.y" -- { yyval.p = op1(VARNF, (Node *) yyvsp[0].cp); } -- break; -- -- case 185: --#line 442 "awkgram.y" -- { yyval.p = notnull(yyvsp[-1].p); } -- break; -- -- -- } -- --/* Line 991 of yacc.c. */ --#line 3099 "y.tab.c" -- -- yyvsp -= yylen; -- yyssp -= yylen; -- -- -- YY_STACK_PRINT (yyss, yyssp); -- -- *++yyvsp = yyval; -- -- -- /* Now `shift' the result of the reduction. Determine what state -- that goes to, based on the state we popped back to and the rule -- number reduced by. */ -- -- yyn = yyr1[yyn]; -- -- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; -- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) -- yystate = yytable[yystate]; -- else -- yystate = yydefgoto[yyn - YYNTOKENS]; -- -- goto yynewstate; -- -- --/*------------------------------------. --| yyerrlab -- here on detecting error | --`------------------------------------*/ --yyerrlab: -- /* If not already recovering from an error, report this error. */ -- if (!yyerrstatus) -- { -- ++yynerrs; --#if YYERROR_VERBOSE -- yyn = yypact[yystate]; -- -- if (YYPACT_NINF < yyn && yyn < YYLAST) -- { -- YYSIZE_T yysize = 0; -- int yytype = YYTRANSLATE (yychar); -- char *yymsg; -- int yyx, yycount; -- -- yycount = 0; -- /* Start YYX at -YYN if negative to avoid negative indexes in -- YYCHECK. */ -- for (yyx = yyn < 0 ? -yyn : 0; -- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) -- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) -- yysize += yystrlen (yytname[yyx]) + 15, yycount++; -- yysize += yystrlen ("syntax error, unexpected ") + 1; -- yysize += yystrlen (yytname[yytype]); -- yymsg = (char *) YYSTACK_ALLOC (yysize); -- if (yymsg != 0) -- { -- char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); -- yyp = yystpcpy (yyp, yytname[yytype]); -- -- if (yycount < 5) -- { -- yycount = 0; -- for (yyx = yyn < 0 ? -yyn : 0; -- yyx < (int) (sizeof (yytname) / sizeof (char *)); -- yyx++) -- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) -- { -- const char *yyq = ! yycount ? ", expecting " : " or "; -- yyp = yystpcpy (yyp, yyq); -- yyp = yystpcpy (yyp, yytname[yyx]); -- yycount++; -- } -- } -- yyerror (yymsg); -- YYSTACK_FREE (yymsg); -- } -- else -- yyerror ("syntax error; also virtual memory exhausted"); -- } -- else --#endif /* YYERROR_VERBOSE */ -- yyerror ("syntax error"); -- } -- -- -- -- if (yyerrstatus == 3) -- { -- /* If just tried and failed to reuse lookahead token after an -- error, discard it. */ -- -- /* Return failure if at end of input. */ -- if (yychar == YYEOF) -- { -- /* Pop the error token. */ -- YYPOPSTACK; -- /* Pop the rest of the stack. */ -- while (yyss < yyssp) -- { -- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); -- yydestruct (yystos[*yyssp], yyvsp); -- YYPOPSTACK; -- } -- YYABORT; -- } -- -- YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); -- yydestruct (yytoken, &yylval); -- yychar = YYEMPTY; -- -- } -- -- /* Else will try to reuse lookahead token after shifting the error -- token. */ -- goto yyerrlab2; -- -- --/*----------------------------------------------------. --| yyerrlab1 -- error raised explicitly by an action. | --`----------------------------------------------------*/ --yyerrlab1: -- -- /* Suppress GCC warning that yyerrlab1 is unused when no action -- invokes YYERROR. */ --#if defined (__GNUC_MINOR__) && 2093 <= (__GNUC__ * 1000 + __GNUC_MINOR__) -- __attribute__ ((__unused__)) --#endif -- -- -- goto yyerrlab2; -- -- --/*---------------------------------------------------------------. --| yyerrlab2 -- pop states until the error token can be shifted. | --`---------------------------------------------------------------*/ --yyerrlab2: -- yyerrstatus = 3; /* Each real token shifted decrements this. */ -- -- for (;;) -- { -- yyn = yypact[yystate]; -- if (yyn != YYPACT_NINF) -- { -- yyn += YYTERROR; -- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) -- { -- yyn = yytable[yyn]; -- if (0 < yyn) -- break; -- } -- } -- -- /* Pop the current state because it cannot handle the error token. */ -- if (yyssp == yyss) -- YYABORT; -- -- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); -- yydestruct (yystos[yystate], yyvsp); -- yyvsp--; -- yystate = *--yyssp; -- -- YY_STACK_PRINT (yyss, yyssp); -- } -- -- if (yyn == YYFINAL) -- YYACCEPT; -- -- YYDPRINTF ((stderr, "Shifting error token, ")); -- -- *++yyvsp = yylval; -- -- -- yystate = yyn; -- goto yynewstate; -- -- --/*-------------------------------------. --| yyacceptlab -- YYACCEPT comes here. | --`-------------------------------------*/ --yyacceptlab: -- yyresult = 0; -- goto yyreturn; -- --/*-----------------------------------. --| yyabortlab -- YYABORT comes here. | --`-----------------------------------*/ --yyabortlab: -- yyresult = 1; -- goto yyreturn; -- --#ifndef yyoverflow --/*----------------------------------------------. --| yyoverflowlab -- parser overflow comes here. | --`----------------------------------------------*/ --yyoverflowlab: -- yyerror ("parser stack overflow"); -- yyresult = 2; -- /* Fall through. */ --#endif -- --yyreturn: --#ifndef yyoverflow -- if (yyss != yyssa) -- YYSTACK_FREE (yyss); --#endif -- return yyresult; --} -- -- --#line 445 "awkgram.y" -- -- --void setfname(Cell *p) --{ -- if (isarr(p)) -- SYNTAX("%s is an array, not a function", p->nval); -- else if (isfcn(p)) -- SYNTAX("you can't define function %s more than once", p->nval); -- curfname = p->nval; --} -- --int constnode(Node *p) --{ -- return isvalue(p) && ((Cell *) (p->narg[0]))->csub == CCON; --} -- --char *strnode(Node *p) --{ -- return ((Cell *)(p->narg[0]))->sval; --} -- --Node *notnull(Node *n) --{ -- switch (n->nobj) { -- case LE: case LT: case EQ: case NE: case GT: case GE: -- case BOR: case AND: case NOT: -- return n; -- default: -- return op2(NE, n, nullnode); -- } --} -- --void checkdup(Node *vl, Cell *cp) /* check if name already in list */ --{ -- char *s = cp->nval; -- for ( ; vl; vl = vl->nnext) { -- if (strcmp(s, ((Cell *)(vl->narg[0]))->nval) == 0) { -- SYNTAX("duplicate argument %s", s); -- break; -- } -- } --} -- -//GO.SYSIN DD ytab.c -echo ytab.h 1>&2 -sed 's/.//' >ytab.h <<'//GO.SYSIN DD ytab.h' --/* A Bison parser, made by GNU Bison 1.875. */ -- --/* Skeleton parser for Yacc-like parsing with Bison, -- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2, or (at your option) -- any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place - Suite 330, -- Boston, MA 02111-1307, USA. */ -- --/* As a special exception, when this file is copied by Bison into a -- Bison output file, you may use that output file without restriction. -- This special exception was added by the Free Software Foundation -- in version 1.24 of Bison. */ -- --/* Tokens. */ --#ifndef YYTOKENTYPE --# define YYTOKENTYPE -- /* Put the tokens into the symbol table, so that GDB and other debuggers -- know about them. */ -- enum yytokentype { -- FIRSTTOKEN = 258, -- PROGRAM = 259, -- PASTAT = 260, -- PASTAT2 = 261, -- XBEGIN = 262, -- XEND = 263, -- NL = 264, -- ARRAY = 265, -- MATCH = 266, -- NOTMATCH = 267, -- MATCHOP = 268, -- FINAL = 269, -- DOT = 270, -- ALL = 271, -- CCL = 272, -- NCCL = 273, -- CHAR = 274, -- OR = 275, -- STAR = 276, -- QUEST = 277, -- PLUS = 278, -- AND = 279, -- BOR = 280, -- APPEND = 281, -- EQ = 282, -- GE = 283, -- GT = 284, -- LE = 285, -- LT = 286, -- NE = 287, -- IN = 288, -- ARG = 289, -- BLTIN = 290, -- BREAK = 291, -- CLOSE = 292, -- CONTINUE = 293, -- DELETE = 294, -- DO = 295, -- EXIT = 296, -- FOR = 297, -- FUNC = 298, -- SUB = 299, -- GSUB = 300, -- IF = 301, -- INDEX = 302, -- LSUBSTR = 303, -- MATCHFCN = 304, -- NEXT = 305, -- NEXTFILE = 306, -- ADD = 307, -- MINUS = 308, -- MULT = 309, -- DIVIDE = 310, -- MOD = 311, -- ASSIGN = 312, -- ASGNOP = 313, -- ADDEQ = 314, -- SUBEQ = 315, -- MULTEQ = 316, -- DIVEQ = 317, -- MODEQ = 318, -- POWEQ = 319, -- PRINT = 320, -- PRINTF = 321, -- SPRINTF = 322, -- ELSE = 323, -- INTEST = 324, -- CONDEXPR = 325, -- POSTINCR = 326, -- PREINCR = 327, -- POSTDECR = 328, -- PREDECR = 329, -- VAR = 330, -- IVAR = 331, -- VARNF = 332, -- CALL = 333, -- NUMBER = 334, -- STRING = 335, -- REGEXPR = 336, -- GETLINE = 337, -- SUBSTR = 338, -- SPLIT = 339, -- RETURN = 340, -- WHILE = 341, -- CAT = 342, -- UMINUS = 343, -- NOT = 344, -- POWER = 345, -- INCR = 346, -- DECR = 347, -- INDIRECT = 348, -- LASTTOKEN = 349 -- }; --#endif --#define FIRSTTOKEN 258 --#define PROGRAM 259 --#define PASTAT 260 --#define PASTAT2 261 --#define XBEGIN 262 --#define XEND 263 --#define NL 264 --#define ARRAY 265 --#define MATCH 266 --#define NOTMATCH 267 --#define MATCHOP 268 --#define FINAL 269 --#define DOT 270 --#define ALL 271 --#define CCL 272 --#define NCCL 273 --#define CHAR 274 --#define OR 275 --#define STAR 276 --#define QUEST 277 --#define PLUS 278 --#define AND 279 --#define BOR 280 --#define APPEND 281 --#define EQ 282 --#define GE 283 --#define GT 284 --#define LE 285 --#define LT 286 --#define NE 287 --#define IN 288 --#define ARG 289 --#define BLTIN 290 --#define BREAK 291 --#define CLOSE 292 --#define CONTINUE 293 --#define DELETE 294 --#define DO 295 --#define EXIT 296 --#define FOR 297 --#define FUNC 298 --#define SUB 299 --#define GSUB 300 --#define IF 301 --#define INDEX 302 --#define LSUBSTR 303 --#define MATCHFCN 304 --#define NEXT 305 --#define NEXTFILE 306 --#define ADD 307 --#define MINUS 308 --#define MULT 309 --#define DIVIDE 310 --#define MOD 311 --#define ASSIGN 312 --#define ASGNOP 313 --#define ADDEQ 314 --#define SUBEQ 315 --#define MULTEQ 316 --#define DIVEQ 317 --#define MODEQ 318 --#define POWEQ 319 --#define PRINT 320 --#define PRINTF 321 --#define SPRINTF 322 --#define ELSE 323 --#define INTEST 324 --#define CONDEXPR 325 --#define POSTINCR 326 --#define PREINCR 327 --#define POSTDECR 328 --#define PREDECR 329 --#define VAR 330 --#define IVAR 331 --#define VARNF 332 --#define CALL 333 --#define NUMBER 334 --#define STRING 335 --#define REGEXPR 336 --#define GETLINE 337 --#define SUBSTR 338 --#define SPLIT 339 --#define RETURN 340 --#define WHILE 341 --#define CAT 342 --#define UMINUS 343 --#define NOT 344 --#define POWER 345 --#define INCR 346 --#define DECR 347 --#define INDIRECT 348 --#define LASTTOKEN 349 -- -- -- -- --#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) --#line 41 "awkgram.y" --typedef union YYSTYPE { -- Node *p; -- Cell *cp; -- int i; -- char *s; --} YYSTYPE; --/* Line 1248 of yacc.c. */ --#line 231 "y.tab.h" --# define yystype YYSTYPE /* obsolescent; will be withdrawn */ --# define YYSTYPE_IS_DECLARED 1 --# define YYSTYPE_IS_TRIVIAL 1 --#endif -- --extern YYSTYPE yylval; -- -- -- -//GO.SYSIN DD ytab.h -echo proto.h 1>&2 -sed 's/.//' >proto.h <<'//GO.SYSIN DD proto.h' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --extern int yywrap(void); --extern void setfname(Cell *); --extern int constnode(Node *); --extern char *strnode(Node *); --extern Node *notnull(Node *); --extern int yyparse(void); -- --extern int yylex(void); --extern void startreg(void); --extern int input(void); --extern void unput(int); --extern void unputstr(const char *); --extern int yylook(void); --extern int yyback(int *, int); --extern int yyinput(void); -- --extern fa *makedfa(const char *, int); --extern fa *mkdfa(const char *, int); --extern int makeinit(fa *, int); --extern void penter(Node *); --extern void freetr(Node *); --extern int hexstr(char **); --extern int quoted(char **); --extern char *cclenter(const char *); --extern void overflo(const char *); --extern void cfoll(fa *, Node *); --extern int first(Node *); --extern void follow(Node *); --extern int member(int, const char *); --extern int match(fa *, const char *); --extern int pmatch(fa *, const char *); --extern int nematch(fa *, const char *); --extern Node *reparse(const char *); --extern Node *regexp(void); --extern Node *primary(void); --extern Node *concat(Node *); --extern Node *alt(Node *); --extern Node *unary(Node *); --extern int relex(void); --extern int cgoto(fa *, int, int); --extern void freefa(fa *); -- --extern int pgetc(void); --extern char *cursource(void); -- --extern Node *nodealloc(int); --extern Node *exptostat(Node *); --extern Node *node1(int, Node *); --extern Node *node2(int, Node *, Node *); --extern Node *node3(int, Node *, Node *, Node *); --extern Node *node4(int, Node *, Node *, Node *, Node *); --extern Node *stat3(int, Node *, Node *, Node *); --extern Node *op2(int, Node *, Node *); --extern Node *op1(int, Node *); --extern Node *stat1(int, Node *); --extern Node *op3(int, Node *, Node *, Node *); --extern Node *op4(int, Node *, Node *, Node *, Node *); --extern Node *stat2(int, Node *, Node *); --extern Node *stat4(int, Node *, Node *, Node *, Node *); --extern Node *celltonode(Cell *, int); --extern Node *rectonode(void); --extern Node *makearr(Node *); --extern Node *pa2stat(Node *, Node *, Node *); --extern Node *linkum(Node *, Node *); --extern void defn(Cell *, Node *, Node *); --extern int isarg(const char *); --extern char *tokname(int); --extern Cell *(*proctab[])(Node **, int); --extern int ptoi(void *); --extern Node *itonp(int); -- --extern void syminit(void); --extern void arginit(int, char **); --extern void envinit(char **); --extern Array *makesymtab(int); --extern void freesymtab(Cell *); --extern void freeelem(Cell *, const char *); --extern Cell *setsymtab(const char *, const char *, double, unsigned int, Array *); --extern int hash(const char *, int); --extern void rehash(Array *); --extern Cell *lookup(const char *, Array *); --extern double setfval(Cell *, double); --extern void funnyvar(Cell *, const char *); --extern char *setsval(Cell *, const char *); --extern double getfval(Cell *); --extern char *getsval(Cell *); --extern char *getpssval(Cell *); /* for print */ --extern char *tostring(const char *); --extern char *qstring(const char *, int); -- --extern void recinit(unsigned int); --extern void initgetrec(void); --extern void makefields(int, int); --extern void growfldtab(int n); --extern int getrec(char **, int *, int); --extern void nextfile(void); --extern int readrec(char **buf, int *bufsize, FILE *inf); --extern char *getargv(int); --extern void setclvar(char *); --extern void fldbld(void); --extern void cleanfld(int, int); --extern void newfld(int); --extern int refldbld(const char *, const char *); --extern void recbld(void); --extern Cell *fieldadr(int); --extern void yyerror(const char *); --extern void fpecatch(int); --extern void bracecheck(void); --extern void bcheck2(int, int, int); --extern void SYNTAX(const char *, ...); --extern void FATAL(const char *, ...); --extern void WARNING(const char *, ...); --extern void error(void); --extern void eprint(void); --extern void bclass(int); --extern double errcheck(double, const char *); --extern int isclvar(const char *); --extern int is_number(const char *); -- --extern int adjbuf(char **pb, int *sz, int min, int q, char **pbp, const char *what); --extern void run(Node *); --extern Cell *execute(Node *); --extern Cell *program(Node **, int); --extern Cell *call(Node **, int); --extern Cell *copycell(Cell *); --extern Cell *arg(Node **, int); --extern Cell *jump(Node **, int); --extern Cell *getline(Node **, int); --extern Cell *getnf(Node **, int); --extern Cell *array(Node **, int); --extern Cell *awkdelete(Node **, int); --extern Cell *intest(Node **, int); --extern Cell *matchop(Node **, int); --extern Cell *boolop(Node **, int); --extern Cell *relop(Node **, int); --extern void tfree(Cell *); --extern Cell *gettemp(void); --extern Cell *field(Node **, int); --extern Cell *indirect(Node **, int); --extern Cell *substr(Node **, int); --extern Cell *sindex(Node **, int); --extern int format(char **, int *, const char *, Node *); --extern Cell *awksprintf(Node **, int); --extern Cell *awkprintf(Node **, int); --extern Cell *arith(Node **, int); --extern double ipow(double, int); --extern Cell *incrdecr(Node **, int); --extern Cell *assign(Node **, int); --extern Cell *cat(Node **, int); --extern Cell *pastat(Node **, int); --extern Cell *dopa2(Node **, int); --extern Cell *split(Node **, int); --extern Cell *condexpr(Node **, int); --extern Cell *ifstat(Node **, int); --extern Cell *whilestat(Node **, int); --extern Cell *dostat(Node **, int); --extern Cell *forstat(Node **, int); --extern Cell *instat(Node **, int); --extern Cell *bltin(Node **, int); --extern Cell *printstat(Node **, int); --extern Cell *nullproc(Node **, int); --extern FILE *redirect(int, Node *); --extern FILE *openfile(int, const char *); --extern const char *filename(FILE *); --extern Cell *closefile(Node **, int); --extern void closeall(void); --extern Cell *sub(Node **, int); --extern Cell *gsub(Node **, int); -- --extern FILE *popen(const char *, const char *); --extern int pclose(FILE *); -//GO.SYSIN DD proto.h -echo awkgram.y 1>&2 -sed 's/.//' >awkgram.y <<'//GO.SYSIN DD awkgram.y' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --%{ --#include <stdio.h> --#include <string.h> --#include "awk.h" -- --void checkdup(Node *list, Cell *item); --int yywrap(void) { return(1); } -- --Node *beginloc = 0; --Node *endloc = 0; --int infunc = 0; /* = 1 if in arglist or body of func */ --int inloop = 0; /* = 1 if in while, for, do */ --char *curfname = 0; /* current function name */ --Node *arglist = 0; /* list of args for current function */ --%} -- --%union { -- Node *p; -- Cell *cp; -- int i; -- char *s; --} -- --%token <i> FIRSTTOKEN /* must be first */ --%token <p> PROGRAM PASTAT PASTAT2 XBEGIN XEND --%token <i> NL ',' '{' '(' '|' ';' '/' ')' '}' '[' ']' --%token <i> ARRAY --%token <i> MATCH NOTMATCH MATCHOP --%token <i> FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS --%token <i> AND BOR APPEND EQ GE GT LE LT NE IN --%token <i> ARG BLTIN BREAK CLOSE CONTINUE DELETE DO EXIT FOR FUNC --%token <i> SUB GSUB IF INDEX LSUBSTR MATCHFCN NEXT NEXTFILE --%token <i> ADD MINUS MULT DIVIDE MOD --%token <i> ASSIGN ASGNOP ADDEQ SUBEQ MULTEQ DIVEQ MODEQ POWEQ --%token <i> PRINT PRINTF SPRINTF --%token <p> ELSE INTEST CONDEXPR --%token <i> POSTINCR PREINCR POSTDECR PREDECR --%token <cp> VAR IVAR VARNF CALL NUMBER STRING --%token <s> REGEXPR -- --%type <p> pas pattern ppattern plist pplist patlist prarg term re --%type <p> pa_pat pa_stat pa_stats --%type <s> reg_expr --%type <p> simple_stmt opt_simple_stmt stmt stmtlist --%type <p> var varname funcname varlist --%type <p> for if else while --%type <i> do st --%type <i> pst opt_pst lbrace rbrace rparen comma nl opt_nl and bor --%type <i> subop print -- --%right ASGNOP --%right '?' --%right ':' --%left BOR --%left AND --%left GETLINE --%nonassoc APPEND EQ GE GT LE LT NE MATCHOP IN '|' --%left ARG BLTIN BREAK CALL CLOSE CONTINUE DELETE DO EXIT FOR FUNC --%left GSUB IF INDEX LSUBSTR MATCHFCN NEXT NUMBER --%left PRINT PRINTF RETURN SPLIT SPRINTF STRING SUB SUBSTR --%left REGEXPR VAR VARNF IVAR WHILE '(' --%left CAT --%left '+' '-' --%left '*' '/' '%' --%left NOT UMINUS --%right POWER --%right DECR INCR --%left INDIRECT --%token LASTTOKEN /* must be last */ -- --%% -- --program: -- pas { if (errorflag==0) -- winner = (Node *)stat3(PROGRAM, beginloc, $1, endloc); } -- | error { yyclearin; bracecheck(); SYNTAX("bailing out"); } -- ; -- --and: -- AND | and NL -- ; -- --bor: -- BOR | bor NL -- ; -- --comma: -- ',' | comma NL -- ; -- --do: -- DO | do NL -- ; -- --else: -- ELSE | else NL -- ; -- --for: -- FOR '(' opt_simple_stmt ';' opt_nl pattern ';' opt_nl opt_simple_stmt rparen {inloop++;} stmt -- { --inloop; $$ = stat4(FOR, $3, notnull($6), $9, $12); } -- | FOR '(' opt_simple_stmt ';' ';' opt_nl opt_simple_stmt rparen {inloop++;} stmt -- { --inloop; $$ = stat4(FOR, $3, NIL, $7, $10); } -- | FOR '(' varname IN varname rparen {inloop++;} stmt -- { --inloop; $$ = stat3(IN, $3, makearr($5), $8); } -- ; -- --funcname: -- VAR { setfname($1); } -- | CALL { setfname($1); } -- ; -- --if: -- IF '(' pattern rparen { $$ = notnull($3); } -- ; -- --lbrace: -- '{' | lbrace NL -- ; -- --nl: -- NL | nl NL -- ; -- --opt_nl: -- /* empty */ { $$ = 0; } -- | nl -- ; -- --opt_pst: -- /* empty */ { $$ = 0; } -- | pst -- ; -- -- --opt_simple_stmt: -- /* empty */ { $$ = 0; } -- | simple_stmt -- ; -- --pas: -- opt_pst { $$ = 0; } -- | opt_pst pa_stats opt_pst { $$ = $2; } -- ; -- --pa_pat: -- pattern { $$ = notnull($1); } -- ; -- --pa_stat: -- pa_pat { $$ = stat2(PASTAT, $1, stat2(PRINT, rectonode(), NIL)); } -- | pa_pat lbrace stmtlist '}' { $$ = stat2(PASTAT, $1, $3); } -- | pa_pat ',' pa_pat { $$ = pa2stat($1, $3, stat2(PRINT, rectonode(), NIL)); } -- | pa_pat ',' pa_pat lbrace stmtlist '}' { $$ = pa2stat($1, $3, $5); } -- | lbrace stmtlist '}' { $$ = stat2(PASTAT, NIL, $2); } -- | XBEGIN lbrace stmtlist '}' -- { beginloc = linkum(beginloc, $3); $$ = 0; } -- | XEND lbrace stmtlist '}' -- { endloc = linkum(endloc, $3); $$ = 0; } -- | FUNC funcname '(' varlist rparen {infunc++;} lbrace stmtlist '}' -- { infunc--; curfname=0; defn((Cell *)$2, $4, $8); $$ = 0; } -- ; -- --pa_stats: -- pa_stat -- | pa_stats opt_pst pa_stat { $$ = linkum($1, $3); } -- ; -- --patlist: -- pattern -- | patlist comma pattern { $$ = linkum($1, $3); } -- ; -- --ppattern: -- var ASGNOP ppattern { $$ = op2($2, $1, $3); } -- | ppattern '?' ppattern ':' ppattern %prec '?' -- { $$ = op3(CONDEXPR, notnull($1), $3, $5); } -- | ppattern bor ppattern %prec BOR -- { $$ = op2(BOR, notnull($1), notnull($3)); } -- | ppattern and ppattern %prec AND -- { $$ = op2(AND, notnull($1), notnull($3)); } -- | ppattern MATCHOP reg_expr { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); } -- | ppattern MATCHOP ppattern -- { if (constnode($3)) -- $$ = op3($2, NIL, $1, (Node*)makedfa(strnode($3), 0)); -- else -- $$ = op3($2, (Node *)1, $1, $3); } -- | ppattern IN varname { $$ = op2(INTEST, $1, makearr($3)); } -- | '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); } -- | ppattern term %prec CAT { $$ = op2(CAT, $1, $2); } -- | re -- | term -- ; -- --pattern: -- var ASGNOP pattern { $$ = op2($2, $1, $3); } -- | pattern '?' pattern ':' pattern %prec '?' -- { $$ = op3(CONDEXPR, notnull($1), $3, $5); } -- | pattern bor pattern %prec BOR -- { $$ = op2(BOR, notnull($1), notnull($3)); } -- | pattern and pattern %prec AND -- { $$ = op2(AND, notnull($1), notnull($3)); } -- | pattern EQ pattern { $$ = op2($2, $1, $3); } -- | pattern GE pattern { $$ = op2($2, $1, $3); } -- | pattern GT pattern { $$ = op2($2, $1, $3); } -- | pattern LE pattern { $$ = op2($2, $1, $3); } -- | pattern LT pattern { $$ = op2($2, $1, $3); } -- | pattern NE pattern { $$ = op2($2, $1, $3); } -- | pattern MATCHOP reg_expr { $$ = op3($2, NIL, $1, (Node*)makedfa($3, 0)); } -- | pattern MATCHOP pattern -- { if (constnode($3)) -- $$ = op3($2, NIL, $1, (Node*)makedfa(strnode($3), 0)); -- else -- $$ = op3($2, (Node *)1, $1, $3); } -- | pattern IN varname { $$ = op2(INTEST, $1, makearr($3)); } -- | '(' plist ')' IN varname { $$ = op2(INTEST, $2, makearr($5)); } -- | pattern '|' GETLINE var { -- if (safe) SYNTAX("cmd | getline is unsafe"); -- else $$ = op3(GETLINE, $4, itonp($2), $1); } -- | pattern '|' GETLINE { -- if (safe) SYNTAX("cmd | getline is unsafe"); -- else $$ = op3(GETLINE, (Node*)0, itonp($2), $1); } -- | pattern term %prec CAT { $$ = op2(CAT, $1, $2); } -- | re -- | term -- ; -- --plist: -- pattern comma pattern { $$ = linkum($1, $3); } -- | plist comma pattern { $$ = linkum($1, $3); } -- ; -- --pplist: -- ppattern -- | pplist comma ppattern { $$ = linkum($1, $3); } -- ; -- --prarg: -- /* empty */ { $$ = rectonode(); } -- | pplist -- | '(' plist ')' { $$ = $2; } -- ; -- --print: -- PRINT | PRINTF -- ; -- --pst: -- NL | ';' | pst NL | pst ';' -- ; -- --rbrace: -- '}' | rbrace NL -- ; -- --re: -- reg_expr -- { $$ = op3(MATCH, NIL, rectonode(), (Node*)makedfa($1, 0)); } -- | NOT re { $$ = op1(NOT, notnull($2)); } -- ; -- --reg_expr: -- '/' {startreg();} REGEXPR '/' { $$ = $3; } -- ; -- --rparen: -- ')' | rparen NL -- ; -- --simple_stmt: -- print prarg '|' term { -- if (safe) SYNTAX("print | is unsafe"); -- else $$ = stat3($1, $2, itonp($3), $4); } -- | print prarg APPEND term { -- if (safe) SYNTAX("print >> is unsafe"); -- else $$ = stat3($1, $2, itonp($3), $4); } -- | print prarg GT term { -- if (safe) SYNTAX("print > is unsafe"); -- else $$ = stat3($1, $2, itonp($3), $4); } -- | print prarg { $$ = stat3($1, $2, NIL, NIL); } -- | DELETE varname '[' patlist ']' { $$ = stat2(DELETE, makearr($2), $4); } -- | DELETE varname { $$ = stat2(DELETE, makearr($2), 0); } -- | pattern { $$ = exptostat($1); } -- | error { yyclearin; SYNTAX("illegal statement"); } -- ; -- --st: -- nl -- | ';' opt_nl -- ; -- --stmt: -- BREAK st { if (!inloop) SYNTAX("break illegal outside of loops"); -- $$ = stat1(BREAK, NIL); } -- | CONTINUE st { if (!inloop) SYNTAX("continue illegal outside of loops"); -- $$ = stat1(CONTINUE, NIL); } -- | do {inloop++;} stmt {--inloop;} WHILE '(' pattern ')' st -- { $$ = stat2(DO, $3, notnull($7)); } -- | EXIT pattern st { $$ = stat1(EXIT, $2); } -- | EXIT st { $$ = stat1(EXIT, NIL); } -- | for -- | if stmt else stmt { $$ = stat3(IF, $1, $2, $4); } -- | if stmt { $$ = stat3(IF, $1, $2, NIL); } -- | lbrace stmtlist rbrace { $$ = $2; } -- | NEXT st { if (infunc) -- SYNTAX("next is illegal inside a function"); -- $$ = stat1(NEXT, NIL); } -- | NEXTFILE st { if (infunc) -- SYNTAX("nextfile is illegal inside a function"); -- $$ = stat1(NEXTFILE, NIL); } -- | RETURN pattern st { $$ = stat1(RETURN, $2); } -- | RETURN st { $$ = stat1(RETURN, NIL); } -- | simple_stmt st -- | while {inloop++;} stmt { --inloop; $$ = stat2(WHILE, $1, $3); } -- | ';' opt_nl { $$ = 0; } -- ; -- --stmtlist: -- stmt -- | stmtlist stmt { $$ = linkum($1, $2); } -- ; -- --subop: -- SUB | GSUB -- ; -- --term: -- term '/' ASGNOP term { $$ = op2(DIVEQ, $1, $4); } -- | term '+' term { $$ = op2(ADD, $1, $3); } -- | term '-' term { $$ = op2(MINUS, $1, $3); } -- | term '*' term { $$ = op2(MULT, $1, $3); } -- | term '/' term { $$ = op2(DIVIDE, $1, $3); } -- | term '%' term { $$ = op2(MOD, $1, $3); } -- | term POWER term { $$ = op2(POWER, $1, $3); } -- | '-' term %prec UMINUS { $$ = op1(UMINUS, $2); } -- | '+' term %prec UMINUS { $$ = $2; } -- | NOT term %prec UMINUS { $$ = op1(NOT, notnull($2)); } -- | BLTIN '(' ')' { $$ = op2(BLTIN, itonp($1), rectonode()); } -- | BLTIN '(' patlist ')' { $$ = op2(BLTIN, itonp($1), $3); } -- | BLTIN { $$ = op2(BLTIN, itonp($1), rectonode()); } -- | CALL '(' ')' { $$ = op2(CALL, celltonode($1,CVAR), NIL); } -- | CALL '(' patlist ')' { $$ = op2(CALL, celltonode($1,CVAR), $3); } -- | CLOSE term { $$ = op1(CLOSE, $2); } -- | DECR var { $$ = op1(PREDECR, $2); } -- | INCR var { $$ = op1(PREINCR, $2); } -- | var DECR { $$ = op1(POSTDECR, $1); } -- | var INCR { $$ = op1(POSTINCR, $1); } -- | GETLINE var LT term { $$ = op3(GETLINE, $2, itonp($3), $4); } -- | GETLINE LT term { $$ = op3(GETLINE, NIL, itonp($2), $3); } -- | GETLINE var { $$ = op3(GETLINE, $2, NIL, NIL); } -- | GETLINE { $$ = op3(GETLINE, NIL, NIL, NIL); } -- | INDEX '(' pattern comma pattern ')' -- { $$ = op2(INDEX, $3, $5); } -- | INDEX '(' pattern comma reg_expr ')' -- { SYNTAX("index() doesn't permit regular expressions"); -- $$ = op2(INDEX, $3, (Node*)$5); } -- | '(' pattern ')' { $$ = $2; } -- | MATCHFCN '(' pattern comma reg_expr ')' -- { $$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa($5, 1)); } -- | MATCHFCN '(' pattern comma pattern ')' -- { if (constnode($5)) -- $$ = op3(MATCHFCN, NIL, $3, (Node*)makedfa(strnode($5), 1)); -- else -- $$ = op3(MATCHFCN, (Node *)1, $3, $5); } -- | NUMBER { $$ = celltonode($1, CCON); } -- | SPLIT '(' pattern comma varname comma pattern ')' /* string */ -- { $$ = op4(SPLIT, $3, makearr($5), $7, (Node*)STRING); } -- | SPLIT '(' pattern comma varname comma reg_expr ')' /* const /regexp/ */ -- { $$ = op4(SPLIT, $3, makearr($5), (Node*)makedfa($7, 1), (Node *)REGEXPR); } -- | SPLIT '(' pattern comma varname ')' -- { $$ = op4(SPLIT, $3, makearr($5), NIL, (Node*)STRING); } /* default */ -- | SPRINTF '(' patlist ')' { $$ = op1($1, $3); } -- | STRING { $$ = celltonode($1, CCON); } -- | subop '(' reg_expr comma pattern ')' -- { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, rectonode()); } -- | subop '(' pattern comma pattern ')' -- { if (constnode($3)) -- $$ = op4($1, NIL, (Node*)makedfa(strnode($3), 1), $5, rectonode()); -- else -- $$ = op4($1, (Node *)1, $3, $5, rectonode()); } -- | subop '(' reg_expr comma pattern comma var ')' -- { $$ = op4($1, NIL, (Node*)makedfa($3, 1), $5, $7); } -- | subop '(' pattern comma pattern comma var ')' -- { if (constnode($3)) -- $$ = op4($1, NIL, (Node*)makedfa(strnode($3), 1), $5, $7); -- else -- $$ = op4($1, (Node *)1, $3, $5, $7); } -- | SUBSTR '(' pattern comma pattern comma pattern ')' -- { $$ = op3(SUBSTR, $3, $5, $7); } -- | SUBSTR '(' pattern comma pattern ')' -- { $$ = op3(SUBSTR, $3, $5, NIL); } -- | var -- ; -- --var: -- varname -- | varname '[' patlist ']' { $$ = op2(ARRAY, makearr($1), $3); } -- | IVAR { $$ = op1(INDIRECT, celltonode($1, CVAR)); } -- | INDIRECT term { $$ = op1(INDIRECT, $2); } -- ; -- --varlist: -- /* nothing */ { arglist = $$ = 0; } -- | VAR { arglist = $$ = celltonode($1,CVAR); } -- | varlist comma VAR { -- checkdup($1, $3); -- arglist = $$ = linkum($1,celltonode($3,CVAR)); } -- ; -- --varname: -- VAR { $$ = celltonode($1, CVAR); } -- | ARG { $$ = op1(ARG, itonp($1)); } -- | VARNF { $$ = op1(VARNF, (Node *) $1); } -- ; -- -- --while: -- WHILE '(' pattern rparen { $$ = notnull($3); } -- ; -- --%% -- --void setfname(Cell *p) --{ -- if (isarr(p)) -- SYNTAX("%s is an array, not a function", p->nval); -- else if (isfcn(p)) -- SYNTAX("you can't define function %s more than once", p->nval); -- curfname = p->nval; --} -- --int constnode(Node *p) --{ -- return isvalue(p) && ((Cell *) (p->narg[0]))->csub == CCON; --} -- --char *strnode(Node *p) --{ -- return ((Cell *)(p->narg[0]))->sval; --} -- --Node *notnull(Node *n) --{ -- switch (n->nobj) { -- case LE: case LT: case EQ: case NE: case GT: case GE: -- case BOR: case AND: case NOT: -- return n; -- default: -- return op2(NE, n, nullnode); -- } --} -- --void checkdup(Node *vl, Cell *cp) /* check if name already in list */ --{ -- char *s = cp->nval; -- for ( ; vl; vl = vl->nnext) { -- if (strcmp(s, ((Cell *)(vl->narg[0]))->nval) == 0) { -- SYNTAX("duplicate argument %s", s); -- break; -- } -- } --} -//GO.SYSIN DD awkgram.y -echo lex.c 1>&2 -sed 's/.//' >lex.c <<'//GO.SYSIN DD lex.c' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --#include <stdio.h> --#include <stdlib.h> --#include <string.h> --#include <ctype.h> --#include "awk.h" --#include "ytab.h" -- --extern YYSTYPE yylval; --extern int infunc; -- --int lineno = 1; --int bracecnt = 0; --int brackcnt = 0; --int parencnt = 0; -- --typedef struct Keyword { -- const char *word; -- int sub; -- int type; --} Keyword; -- --Keyword keywords[] ={ /* keep sorted: binary searched */ -- { "BEGIN", XBEGIN, XBEGIN }, -- { "END", XEND, XEND }, -- { "NF", VARNF, VARNF }, -- { "atan2", FATAN, BLTIN }, -- { "break", BREAK, BREAK }, -- { "close", CLOSE, CLOSE }, -- { "continue", CONTINUE, CONTINUE }, -- { "cos", FCOS, BLTIN }, -- { "delete", DELETE, DELETE }, -- { "do", DO, DO }, -- { "else", ELSE, ELSE }, -- { "exit", EXIT, EXIT }, -- { "exp", FEXP, BLTIN }, -- { "fflush", FFLUSH, BLTIN }, -- { "for", FOR, FOR }, -- { "func", FUNC, FUNC }, -- { "function", FUNC, FUNC }, -- { "getline", GETLINE, GETLINE }, -- { "gsub", GSUB, GSUB }, -- { "if", IF, IF }, -- { "in", IN, IN }, -- { "index", INDEX, INDEX }, -- { "int", FINT, BLTIN }, -- { "length", FLENGTH, BLTIN }, -- { "log", FLOG, BLTIN }, -- { "match", MATCHFCN, MATCHFCN }, -- { "next", NEXT, NEXT }, -- { "nextfile", NEXTFILE, NEXTFILE }, -- { "print", PRINT, PRINT }, -- { "printf", PRINTF, PRINTF }, -- { "rand", FRAND, BLTIN }, -- { "return", RETURN, RETURN }, -- { "sin", FSIN, BLTIN }, -- { "split", SPLIT, SPLIT }, -- { "sprintf", SPRINTF, SPRINTF }, -- { "sqrt", FSQRT, BLTIN }, -- { "srand", FSRAND, BLTIN }, -- { "sub", SUB, SUB }, -- { "substr", SUBSTR, SUBSTR }, -- { "system", FSYSTEM, BLTIN }, -- { "tolower", FTOLOWER, BLTIN }, -- { "toupper", FTOUPPER, BLTIN }, -- { "while", WHILE, WHILE }, --}; -- --#define DEBUG --#ifdef DEBUG --#define RET(x) { if(dbg)printf("lex %s\n", tokname(x)); return(x); } --#else --#define RET(x) return(x) --#endif -- --int peek(void) --{ -- int c = input(); -- unput(c); -- return c; --} -- --int gettok(char **pbuf, int *psz) /* get next input token */ --{ -- int c, retc; -- char *buf = *pbuf; -- int sz = *psz; -- char *bp = buf; -- -- c = input(); -- if (c == 0) -- return 0; -- buf[0] = c; -- buf[1] = 0; -- if (!isalnum(c) && c != '.' && c != '_') -- return c; -- -- *bp++ = c; -- if (isalpha(c) || c == '_') { /* it's a varname */ -- for ( ; (c = input()) != 0; ) { -- if (bp-buf >= sz) -- if (!adjbuf(&buf, &sz, bp-buf+2, 100, &bp, 0)) -- FATAL( "out of space for name %.10s...", buf ); -- if (isalnum(c) || c == '_') -- *bp++ = c; -- else { -- *bp = 0; -- unput(c); -- break; -- } -- } -- *bp = 0; -- retc = 'a'; /* alphanumeric */ -- } else { /* maybe it's a number, but could be . */ -- char *rem; -- /* read input until can't be a number */ -- for ( ; (c = input()) != 0; ) { -- if (bp-buf >= sz) -- if (!adjbuf(&buf, &sz, bp-buf+2, 100, &bp, 0)) -- FATAL( "out of space for number %.10s...", buf ); -- if (isdigit(c) || c == 'e' || c == 'E' -- || c == '.' || c == '+' || c == '-') -- *bp++ = c; -- else { -- unput(c); -- break; -- } -- } -- *bp = 0; -- strtod(buf, &rem); /* parse the number */ -- if (rem == buf) { /* it wasn't a valid number at all */ -- buf[1] = 0; /* return one character as token */ -- retc = buf[0]; /* character is its own type */ -- unputstr(rem+1); /* put rest back for later */ -- } else { /* some prefix was a number */ -- unputstr(rem); /* put rest back for later */ -- rem[0] = 0; /* truncate buf after number part */ -- retc = '0'; /* type is number */ -- } -- } -- *pbuf = buf; -- *psz = sz; -- return retc; --} -- --int word(char *); --int string(void); --int regexpr(void); --int sc = 0; /* 1 => return a } right now */ --int reg = 0; /* 1 => return a REGEXPR now */ -- --int yylex(void) --{ -- int c; -- static char *buf = 0; -- static int bufsize = 500; -- -- if (buf == 0 && (buf = (char *) malloc(bufsize)) == NULL) -- FATAL( "out of space in yylex" ); -- if (sc) { -- sc = 0; -- RET('}'); -- } -- if (reg) { -- reg = 0; -- return regexpr(); -- } --/* printf("top\n"); */ -- for (;;) { -- c = gettok(&buf, &bufsize); --/* printf("gettok [%s]\n", buf); */ -- if (c == 0) -- return 0; -- if (isalpha(c) || c == '_') -- return word(buf); -- if (isdigit(c)) { -- yylval.cp = setsymtab(buf, tostring(buf), atof(buf), CON|NUM, symtab); -- /* should this also have STR set? */ -- RET(NUMBER); -- } -- -- yylval.i = c; -- switch (c) { -- case '\n': /* {EOL} */ -- RET(NL); -- case '\r': /* assume \n is coming */ -- case ' ': /* {WS}+ */ -- case '\t': -- break; -- case '#': /* #.* strip comments */ -- while ((c = input()) != '\n' && c != 0) -- ; -- unput(c); -- break; -- case ';': -- RET(';'); -- case '\\': -- if (peek() == '\n') { -- input(); -- } else if (peek() == '\r') { -- input(); input(); /* \n */ -- lineno++; -- } else { -- RET(c); -- } -- break; -- case '&': -- if (peek() == '&') { -- input(); RET(AND); -- } else -- RET('&'); -- case '|': -- if (peek() == '|') { -- input(); RET(BOR); -- } else -- RET('|'); -- case '!': -- if (peek() == '=') { -- input(); yylval.i = NE; RET(NE); -- } else if (peek() == '~') { -- input(); yylval.i = NOTMATCH; RET(MATCHOP); -- } else -- RET(NOT); -- case '~': -- yylval.i = MATCH; -- RET(MATCHOP); -- case '<': -- if (peek() == '=') { -- input(); yylval.i = LE; RET(LE); -- } else { -- yylval.i = LT; RET(LT); -- } -- case '=': -- if (peek() == '=') { -- input(); yylval.i = EQ; RET(EQ); -- } else { -- yylval.i = ASSIGN; RET(ASGNOP); -- } -- case '>': -- if (peek() == '=') { -- input(); yylval.i = GE; RET(GE); -- } else if (peek() == '>') { -- input(); yylval.i = APPEND; RET(APPEND); -- } else { -- yylval.i = GT; RET(GT); -- } -- case '+': -- if (peek() == '+') { -- input(); yylval.i = INCR; RET(INCR); -- } else if (peek() == '=') { -- input(); yylval.i = ADDEQ; RET(ASGNOP); -- } else -- RET('+'); -- case '-': -- if (peek() == '-') { -- input(); yylval.i = DECR; RET(DECR); -- } else if (peek() == '=') { -- input(); yylval.i = SUBEQ; RET(ASGNOP); -- } else -- RET('-'); -- case '*': -- if (peek() == '=') { /* *= */ -- input(); yylval.i = MULTEQ; RET(ASGNOP); -- } else if (peek() == '*') { /* ** or **= */ -- input(); /* eat 2nd * */ -- if (peek() == '=') { -- input(); yylval.i = POWEQ; RET(ASGNOP); -- } else { -- RET(POWER); -- } -- } else -- RET('*'); -- case '/': -- RET('/'); -- case '%': -- if (peek() == '=') { -- input(); yylval.i = MODEQ; RET(ASGNOP); -- } else -- RET('%'); -- case '^': -- if (peek() == '=') { -- input(); yylval.i = POWEQ; RET(ASGNOP); -- } else -- RET(POWER); -- -- case '$': -- /* BUG: awkward, if not wrong */ -- c = gettok(&buf, &bufsize); -- if (isalpha(c)) { -- if (strcmp(buf, "NF") == 0) { /* very special */ -- unputstr("(NF)"); -- RET(INDIRECT); -- } -- c = peek(); -- if (c == '(' || c == '[' || (infunc && isarg(buf) >= 0)) { -- unputstr(buf); -- RET(INDIRECT); -- } -- yylval.cp = setsymtab(buf, "", 0.0, STR|NUM, symtab); -- RET(IVAR); -- } else if (c == 0) { /* */ -- SYNTAX( "unexpected end of input after $" ); -- RET(';'); -- } else { -- unputstr(buf); -- RET(INDIRECT); -- } -- -- case '}': -- if (--bracecnt < 0) -- SYNTAX( "extra }" ); -- sc = 1; -- RET(';'); -- case ']': -- if (--brackcnt < 0) -- SYNTAX( "extra ]" ); -- RET(']'); -- case ')': -- if (--parencnt < 0) -- SYNTAX( "extra )" ); -- RET(')'); -- case '{': -- bracecnt++; -- RET('{'); -- case '[': -- brackcnt++; -- RET('['); -- case '(': -- parencnt++; -- RET('('); -- -- case '"': -- return string(); /* BUG: should be like tran.c ? */ -- -- default: -- RET(c); -- } -- } --} -- --int string(void) --{ -- int c, n; -- char *s, *bp; -- static char *buf = 0; -- static int bufsz = 500; -- -- if (buf == 0 && (buf = (char *) malloc(bufsz)) == NULL) -- FATAL("out of space for strings"); -- for (bp = buf; (c = input()) != '"'; ) { -- if (!adjbuf(&buf, &bufsz, bp-buf+2, 500, &bp, 0)) -- FATAL("out of space for string %.10s...", buf); -- switch (c) { -- case '\n': -- case '\r': -- case 0: -- SYNTAX( "non-terminated string %.10s...", buf ); -- lineno++; -- if (c == 0) /* hopeless */ -- FATAL( "giving up" ); -- break; -- case '\\': -- c = input(); -- switch (c) { -- case '"': *bp++ = '"'; break; -- case 'n': *bp++ = '\n'; break; -- case 't': *bp++ = '\t'; break; -- case 'f': *bp++ = '\f'; break; -- case 'r': *bp++ = '\r'; break; -- case 'b': *bp++ = '\b'; break; -- case 'v': *bp++ = '\v'; break; -- case 'a': *bp++ = '\007'; break; -- case '\\': *bp++ = '\\'; break; -- -- case '0': case '1': case '2': /* octal: \d \dd \ddd */ -- case '3': case '4': case '5': case '6': case '7': -- n = c - '0'; -- if ((c = peek()) >= '0' && c < '8') { -- n = 8 * n + input() - '0'; -- if ((c = peek()) >= '0' && c < '8') -- n = 8 * n + input() - '0'; -- } -- *bp++ = n; -- break; -- -- case 'x': /* hex \x0-9a-fA-F + */ -- { char xbuf[100], *px; -- for (px = xbuf; (c = input()) != 0 && px-xbuf < 100-2; ) { -- if (isdigit(c) -- || (c >= 'a' && c <= 'f') -- || (c >= 'A' && c <= 'F')) -- *px++ = c; -- else -- break; -- } -- *px = 0; -- unput(c); -- sscanf(xbuf, "%x", &n); -- *bp++ = n; -- break; -- } -- -- default: -- *bp++ = c; -- break; -- } -- break; -- default: -- *bp++ = c; -- break; -- } -- } -- *bp = 0; -- s = tostring(buf); -- *bp++ = ' '; *bp++ = 0; -- yylval.cp = setsymtab(buf, s, 0.0, CON|STR|DONTFREE, symtab); -- RET(STRING); --} -- -- --int binsearch(char *w, Keyword *kp, int n) --{ -- int cond, low, mid, high; -- -- low = 0; -- high = n - 1; -- while (low <= high) { -- mid = (low + high) / 2; -- if ((cond = strcmp(w, kp[mid].word)) < 0) -- high = mid - 1; -- else if (cond > 0) -- low = mid + 1; -- else -- return mid; -- } -- return -1; --} -- --int word(char *w) --{ -- Keyword *kp; -- int c, n; -- -- n = binsearch(w, keywords, sizeof(keywords)/sizeof(keywords[0])); -- kp = keywords + n; -- if (n != -1) { /* found in table */ -- yylval.i = kp->sub; -- switch (kp->type) { /* special handling */ -- case FSYSTEM: -- if (safe) -- SYNTAX( "system is unsafe" ); -- RET(kp->type); -- case FUNC: -- if (infunc) -- SYNTAX( "illegal nested function" ); -- RET(kp->type); -- case RETURN: -- if (!infunc) -- SYNTAX( "return not in function" ); -- RET(kp->type); -- case VARNF: -- yylval.cp = setsymtab("NF", "", 0.0, NUM, symtab); -- RET(VARNF); -- default: -- RET(kp->type); -- } -- } -- c = peek(); /* look for '(' */ -- if (c != '(' && infunc && (n=isarg(w)) >= 0) { -- yylval.i = n; -- RET(ARG); -- } else { -- yylval.cp = setsymtab(w, "", 0.0, STR|NUM|DONTFREE, symtab); -- if (c == '(') { -- RET(CALL); -- } else { -- RET(VAR); -- } -- } --} -- --void startreg(void) /* next call to yylex will return a regular expression */ --{ -- reg = 1; --} -- --int regexpr(void) --{ -- int c; -- static char *buf = 0; -- static int bufsz = 500; -- char *bp; -- -- if (buf == 0 && (buf = (char *) malloc(bufsz)) == NULL) -- FATAL("out of space for rex expr"); -- bp = buf; -- for ( ; (c = input()) != '/' && c != 0; ) { -- if (!adjbuf(&buf, &bufsz, bp-buf+3, 500, &bp, 0)) -- FATAL("out of space for reg expr %.10s...", buf); -- if (c == '\n') { -- SYNTAX( "newline in regular expression %.10s...", buf ); -- unput('\n'); -- break; -- } else if (c == '\\') { -- *bp++ = '\\'; -- *bp++ = input(); -- } else { -- *bp++ = c; -- } -- } -- *bp = 0; -- if (c == 0) -- SYNTAX("non-terminated regular expression %.10s...", buf); -- yylval.s = tostring(buf); -- unput('/'); -- RET(REGEXPR); --} -- --/* low-level lexical stuff, sort of inherited from lex */ -- --char ebuf[300]; --char *ep = ebuf; --char yysbuf[100]; /* pushback buffer */ --char *yysptr = yysbuf; --FILE *yyin = 0; -- --int input(void) /* get next lexical input character */ --{ -- int c; -- extern char *lexprog; -- -- if (yysptr > yysbuf) -- c = (uschar)*--yysptr; -- else if (lexprog != NULL) { /* awk '...' */ -- if ((c = (uschar)*lexprog) != 0) -- lexprog++; -- } else /* awk -f ... */ -- c = pgetc(); -- if (c == '\n') -- lineno++; -- else if (c == EOF) -- c = 0; -- if (ep >= ebuf + sizeof ebuf) -- ep = ebuf; -- return *ep++ = c; --} -- --void unput(int c) /* put lexical character back on input */ --{ -- if (c == '\n') -- lineno--; -- if (yysptr >= yysbuf + sizeof(yysbuf)) -- FATAL("pushed back too much: %.20s...", yysbuf); -- *yysptr++ = c; -- if (--ep < ebuf) -- ep = ebuf + sizeof(ebuf) - 1; --} -- --void unputstr(const char *s) /* put a string back on input */ --{ -- int i; -- -- for (i = strlen(s)-1; i >= 0; i--) -- unput(s[i]); --} -//GO.SYSIN DD lex.c -echo b.c 1>&2 -sed 's/.//' >b.c <<'//GO.SYSIN DD b.c' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --/* lasciate ogne speranza, voi ch'entrate. */ -- --#define DEBUG -- --#include <ctype.h> --#include <stdio.h> --#include <string.h> --#include <stdlib.h> --#include "awk.h" --#include "ytab.h" -- --#define HAT (NCHARS+2) /* matches ^ in regular expr */ -- /* NCHARS is 2**n */ --#define MAXLIN 22 -- --#define type(v) (v)->nobj /* badly overloaded here */ --#define info(v) (v)->ntype /* badly overloaded here */ --#define left(v) (v)->narg[0] --#define right(v) (v)->narg[1] --#define parent(v) (v)->nnext -- --#define LEAF case CCL: case NCCL: case CHAR: case DOT: case FINAL: case ALL: --#define UNARY case STAR: case PLUS: case QUEST: -- --/* encoding in tree Nodes: -- leaf (CCL, NCCL, CHAR, DOT, FINAL, ALL): -- left is index, right contains value or pointer to value -- unary (STAR, PLUS, QUEST): left is child, right is null -- binary (CAT, OR): left and right are children -- parent contains pointer to parent --*/ -- -- --int *setvec; --int *tmpset; --int maxsetvec = 0; -- --int rtok; /* next token in current re */ --int rlxval; --static uschar *rlxstr; --static uschar *prestr; /* current position in current re */ --static uschar *lastre; /* origin of last re */ -- --static int setcnt; --static int poscnt; -- --char *patbeg; --int patlen; -- --#define NFA 20 /* cache this many dynamic fa's */ --fa *fatab[NFA]; --int nfatab = 0; /* entries in fatab */ -- --fa *makedfa(const char *s, int anchor) /* returns dfa for reg expr s */ --{ -- int i, use, nuse; -- fa *pfa; -- static int now = 1; -- -- if (setvec == 0) { /* first time through any RE */ -- maxsetvec = MAXLIN; -- setvec = (int *) malloc(maxsetvec * sizeof(int)); -- tmpset = (int *) malloc(maxsetvec * sizeof(int)); -- if (setvec == 0 || tmpset == 0) -- overflo("out of space initializing makedfa"); -- } -- -- if (compile_time) /* a constant for sure */ -- return mkdfa(s, anchor); -- for (i = 0; i < nfatab; i++) /* is it there already? */ -- if (fatab[i]->anchor == anchor -- && strcmp((const char *) fatab[i]->restr, s) == 0) { -- fatab[i]->use = now++; -- return fatab[i]; -- } -- pfa = mkdfa(s, anchor); -- if (nfatab < NFA) { /* room for another */ -- fatab[nfatab] = pfa; -- fatab[nfatab]->use = now++; -- nfatab++; -- return pfa; -- } -- use = fatab[0]->use; /* replace least-recently used */ -- nuse = 0; -- for (i = 1; i < nfatab; i++) -- if (fatab[i]->use < use) { -- use = fatab[i]->use; -- nuse = i; -- } -- freefa(fatab[nuse]); -- fatab[nuse] = pfa; -- pfa->use = now++; -- return pfa; --} -- --fa *mkdfa(const char *s, int anchor) /* does the real work of making a dfa */ -- /* anchor = 1 for anchored matches, else 0 */ --{ -- Node *p, *p1; -- fa *f; -- -- p = reparse(s); -- p1 = op2(CAT, op2(STAR, op2(ALL, NIL, NIL), NIL), p); -- /* put ALL STAR in front of reg. exp. */ -- p1 = op2(CAT, p1, op2(FINAL, NIL, NIL)); -- /* put FINAL after reg. exp. */ -- -- poscnt = 0; -- penter(p1); /* enter parent pointers and leaf indices */ -- if ((f = (fa *) calloc(1, sizeof(fa) + poscnt*sizeof(rrow))) == NULL) -- overflo("out of space for fa"); -- f->accept = poscnt-1; /* penter has computed number of positions in re */ -- cfoll(f, p1); /* set up follow sets */ -- freetr(p1); -- if ((f->posns[0] = (int *) calloc(1, *(f->re[0].lfollow)*sizeof(int))) == NULL) -- overflo("out of space in makedfa"); -- if ((f->posns[1] = (int *) calloc(1, sizeof(int))) == NULL) -- overflo("out of space in makedfa"); -- *f->posns[1] = 0; -- f->initstat = makeinit(f, anchor); -- f->anchor = anchor; -- f->restr = (uschar *) tostring(s); -- return f; --} -- --int makeinit(fa *f, int anchor) --{ -- int i, k; -- -- f->curstat = 2; -- f->out[2] = 0; -- f->reset = 0; -- k = *(f->re[0].lfollow); -- xfree(f->posns[2]); -- if ((f->posns[2] = (int *) calloc(1, (k+1)*sizeof(int))) == NULL) -- overflo("out of space in makeinit"); -- for (i=0; i <= k; i++) { -- (f->posns[2])[i] = (f->re[0].lfollow)[i]; -- } -- if ((f->posns[2])[1] == f->accept) -- f->out[2] = 1; -- for (i=0; i < NCHARS; i++) -- f->gototab[2][i] = 0; -- f->curstat = cgoto(f, 2, HAT); -- if (anchor) { -- *f->posns[2] = k-1; /* leave out position 0 */ -- for (i=0; i < k; i++) { -- (f->posns[0])[i] = (f->posns[2])[i]; -- } -- -- f->out[0] = f->out[2]; -- if (f->curstat != 2) -- --(*f->posns[f->curstat]); -- } -- return f->curstat; --} -- --void penter(Node *p) /* set up parent pointers and leaf indices */ --{ -- switch (type(p)) { -- LEAF -- info(p) = poscnt; -- poscnt++; -- break; -- UNARY -- penter(left(p)); -- parent(left(p)) = p; -- break; -- case CAT: -- case OR: -- penter(left(p)); -- penter(right(p)); -- parent(left(p)) = p; -- parent(right(p)) = p; -- break; -- default: /* can't happen */ -- FATAL("can't happen: unknown type %d in penter", type(p)); -- break; -- } --} -- --void freetr(Node *p) /* free parse tree */ --{ -- switch (type(p)) { -- LEAF -- xfree(p); -- break; -- UNARY -- freetr(left(p)); -- xfree(p); -- break; -- case CAT: -- case OR: -- freetr(left(p)); -- freetr(right(p)); -- xfree(p); -- break; -- default: /* can't happen */ -- FATAL("can't happen: unknown type %d in freetr", type(p)); -- break; -- } --} -- --/* in the parsing of regular expressions, metacharacters like . have */ --/* to be seen literally; \056 is not a metacharacter. */ -- --int hexstr(char **pp) /* find and eval hex string at pp, return new p */ --{ /* only pick up one 8-bit byte (2 chars) */ -- uschar *p; -- int n = 0; -- int i; -- -- for (i = 0, p = (uschar *) *pp; i < 2 && isxdigit(*p); i++, p++) { -- if (isdigit(*p)) -- n = 16 * n + *p - '0'; -- else if (*p >= 'a' && *p <= 'f') -- n = 16 * n + *p - 'a' + 10; -- else if (*p >= 'A' && *p <= 'F') -- n = 16 * n + *p - 'A' + 10; -- } -- *pp = (char *) p; -- return n; --} -- --#define isoctdigit(c) ((c) >= '0' && (c) <= '7') /* multiple use of arg */ -- --int quoted(char **pp) /* pick up next thing after a \\ */ -- /* and increment *pp */ --{ -- char *p = *pp; -- int c; -- -- if ((c = *p++) == 't') -- c = '\t'; -- else if (c == 'n') -- c = '\n'; -- else if (c == 'f') -- c = '\f'; -- else if (c == 'r') -- c = '\r'; -- else if (c == 'b') -- c = '\b'; -- else if (c == '\\') -- c = '\\'; -- else if (c == 'x') { /* hexadecimal goo follows */ -- c = hexstr(&p); /* this adds a null if number is invalid */ -- } else if (isoctdigit(c)) { /* \d \dd \ddd */ -- int n = c - '0'; -- if (isoctdigit(*p)) { -- n = 8 * n + *p++ - '0'; -- if (isoctdigit(*p)) -- n = 8 * n + *p++ - '0'; -- } -- c = n; -- } /* else */ -- /* c = c; */ -- *pp = p; -- return c; --} -- --char *cclenter(const char *argp) /* add a character class */ --{ -- int i, c, c2; -- uschar *p = (uschar *) argp; -- uschar *op, *bp; -- static uschar *buf = 0; -- static int bufsz = 100; -- -- op = p; -- if (buf == 0 && (buf = (uschar *) malloc(bufsz)) == NULL) -- FATAL("out of space for character class [%.10s...] 1", p); -- bp = buf; -- for (i = 0; (c = *p++) != 0; ) { -- if (c == '\\') { -- c = quoted((char **) &p); -- } else if (c == '-' && i > 0 && bp[-1] != 0) { -- if (*p != 0) { -- c = bp[-1]; -- c2 = *p++; -- if (c2 == '\\') -- c2 = quoted((char **) &p); -- if (c > c2) { /* empty; ignore */ -- bp--; -- i--; -- continue; -- } -- while (c < c2) { -- if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, 0)) -- FATAL("out of space for character class [%.10s...] 2", p); -- *bp++ = ++c; -- i++; -- } -- continue; -- } -- } -- if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, 0)) -- FATAL("out of space for character class [%.10s...] 3", p); -- *bp++ = c; -- i++; -- } -- *bp = 0; -- dprintf( ("cclenter: in = |%s|, out = |%s|\n", op, buf) ); -- xfree(op); -- return (char *) tostring((char *) buf); --} -- --void overflo(const char *s) --{ -- FATAL("regular expression too big: %.30s...", s); --} -- --void cfoll(fa *f, Node *v) /* enter follow set of each leaf of vertex v into lfollow[leaf] */ --{ -- int i; -- int *p; -- -- switch (type(v)) { -- LEAF -- f->re[info(v)].ltype = type(v); -- f->re[info(v)].lval.np = right(v); -- while (f->accept >= maxsetvec) { /* guessing here! */ -- maxsetvec *= 4; -- setvec = (int *) realloc(setvec, maxsetvec * sizeof(int)); -- tmpset = (int *) realloc(tmpset, maxsetvec * sizeof(int)); -- if (setvec == 0 || tmpset == 0) -- overflo("out of space in cfoll()"); -- } -- for (i = 0; i <= f->accept; i++) -- setvec[i] = 0; -- setcnt = 0; -- follow(v); /* computes setvec and setcnt */ -- if ((p = (int *) calloc(1, (setcnt+1)*sizeof(int))) == NULL) -- overflo("out of space building follow set"); -- f->re[info(v)].lfollow = p; -- *p = setcnt; -- for (i = f->accept; i >= 0; i--) -- if (setvec[i] == 1) -- *++p = i; -- break; -- UNARY -- cfoll(f,left(v)); -- break; -- case CAT: -- case OR: -- cfoll(f,left(v)); -- cfoll(f,right(v)); -- break; -- default: /* can't happen */ -- FATAL("can't happen: unknown type %d in cfoll", type(v)); -- } --} -- --int first(Node *p) /* collects initially active leaves of p into setvec */ -- /* returns 1 if p matches empty string */ --{ -- int b, lp; -- -- switch (type(p)) { -- LEAF -- lp = info(p); /* look for high-water mark of subscripts */ -- while (setcnt >= maxsetvec || lp >= maxsetvec) { /* guessing here! */ -- maxsetvec *= 4; -- setvec = (int *) realloc(setvec, maxsetvec * sizeof(int)); -- tmpset = (int *) realloc(tmpset, maxsetvec * sizeof(int)); -- if (setvec == 0 || tmpset == 0) -- overflo("out of space in first()"); -- } -- if (setvec[lp] != 1) { -- setvec[lp] = 1; -- setcnt++; -- } -- if (type(p) == CCL && (*(char *) right(p)) == '\0') -- return(0); /* empty CCL */ -- else return(1); -- case PLUS: -- if (first(left(p)) == 0) return(0); -- return(1); -- case STAR: -- case QUEST: -- first(left(p)); -- return(0); -- case CAT: -- if (first(left(p)) == 0 && first(right(p)) == 0) return(0); -- return(1); -- case OR: -- b = first(right(p)); -- if (first(left(p)) == 0 || b == 0) return(0); -- return(1); -- } -- FATAL("can't happen: unknown type %d in first", type(p)); /* can't happen */ -- return(-1); --} -- --void follow(Node *v) /* collects leaves that can follow v into setvec */ --{ -- Node *p; -- -- if (type(v) == FINAL) -- return; -- p = parent(v); -- switch (type(p)) { -- case STAR: -- case PLUS: -- first(v); -- follow(p); -- return; -- -- case OR: -- case QUEST: -- follow(p); -- return; -- -- case CAT: -- if (v == left(p)) { /* v is left child of p */ -- if (first(right(p)) == 0) { -- follow(p); -- return; -- } -- } else /* v is right child */ -- follow(p); -- return; -- } --} -- --int member(int c, const char *sarg) /* is c in s? */ --{ -- uschar *s = (uschar *) sarg; -- -- while (*s) -- if (c == *s++) -- return(1); -- return(0); --} -- --int match(fa *f, const char *p0) /* shortest match ? */ --{ -- int s, ns; -- uschar *p = (uschar *) p0; -- -- s = f->reset ? makeinit(f,0) : f->initstat; -- if (f->out[s]) -- return(1); -- do { -- assert(*p < NCHARS); -- if ((ns = f->gototab[s][*p]) != 0) -- s = ns; -- else -- s = cgoto(f, s, *p); -- if (f->out[s]) -- return(1); -- } while (*p++ != 0); -- return(0); --} -- --int pmatch(fa *f, const char *p0) /* longest match, for sub */ --{ -- int s, ns; -- uschar *p = (uschar *) p0; -- uschar *q; -- int i, k; -- -- /* s = f->reset ? makeinit(f,1) : f->initstat; */ -- if (f->reset) { -- f->initstat = s = makeinit(f,1); -- } else { -- s = f->initstat; -- } -- patbeg = (char *) p; -- patlen = -1; -- do { -- q = p; -- do { -- if (f->out[s]) /* final state */ -- patlen = q-p; -- assert(*q < NCHARS); -- if ((ns = f->gototab[s][*q]) != 0) -- s = ns; -- else -- s = cgoto(f, s, *q); -- if (s == 1) { /* no transition */ -- if (patlen >= 0) { -- patbeg = (char *) p; -- return(1); -- } -- else -- goto nextin; /* no match */ -- } -- } while (*q++ != 0); -- if (f->out[s]) -- patlen = q-p-1; /* don't count $ */ -- if (patlen >= 0) { -- patbeg = (char *) p; -- return(1); -- } -- nextin: -- s = 2; -- if (f->reset) { -- for (i = 2; i <= f->curstat; i++) -- xfree(f->posns[i]); -- k = *f->posns[0]; -- if ((f->posns[2] = (int *) calloc(1, (k+1)*sizeof(int))) == NULL) -- overflo("out of space in pmatch"); -- for (i = 0; i <= k; i++) -- (f->posns[2])[i] = (f->posns[0])[i]; -- f->initstat = f->curstat = 2; -- f->out[2] = f->out[0]; -- for (i = 0; i < NCHARS; i++) -- f->gototab[2][i] = 0; -- } -- } while (*p++ != 0); -- return (0); --} -- --int nematch(fa *f, const char *p0) /* non-empty match, for sub */ --{ -- int s, ns; -- uschar *p = (uschar *) p0; -- uschar *q; -- int i, k; -- -- /* s = f->reset ? makeinit(f,1) : f->initstat; */ -- if (f->reset) { -- f->initstat = s = makeinit(f,1); -- } else { -- s = f->initstat; -- } -- patlen = -1; -- while (*p) { -- q = p; -- do { -- if (f->out[s]) /* final state */ -- patlen = q-p; -- assert(*q < NCHARS); -- if ((ns = f->gototab[s][*q]) != 0) -- s = ns; -- else -- s = cgoto(f, s, *q); -- if (s == 1) { /* no transition */ -- if (patlen > 0) { -- patbeg = (char *) p; -- return(1); -- } else -- goto nnextin; /* no nonempty match */ -- } -- } while (*q++ != 0); -- if (f->out[s]) -- patlen = q-p-1; /* don't count $ */ -- if (patlen > 0 ) { -- patbeg = (char *) p; -- return(1); -- } -- nnextin: -- s = 2; -- if (f->reset) { -- for (i = 2; i <= f->curstat; i++) -- xfree(f->posns[i]); -- k = *f->posns[0]; -- if ((f->posns[2] = (int *) calloc(1, (k+1)*sizeof(int))) == NULL) -- overflo("out of state space"); -- for (i = 0; i <= k; i++) -- (f->posns[2])[i] = (f->posns[0])[i]; -- f->initstat = f->curstat = 2; -- f->out[2] = f->out[0]; -- for (i = 0; i < NCHARS; i++) -- f->gototab[2][i] = 0; -- } -- p++; -- } -- return (0); --} -- --Node *reparse(const char *p) /* parses regular expression pointed to by p */ --{ /* uses relex() to scan regular expression */ -- Node *np; -- -- dprintf( ("reparse <%s>\n", p) ); -- lastre = prestr = (uschar *) p; /* prestr points to string to be parsed */ -- rtok = relex(); -- /* GNU compatibility: an empty regexp matches anything */ -- if (rtok == '\0') -- /* FATAL("empty regular expression"); previous */ -- return(op2(ALL, NIL, NIL)); -- np = regexp(); -- if (rtok != '\0') -- FATAL("syntax error in regular expression %s at %s", lastre, prestr); -- return(np); --} -- --Node *regexp(void) /* top-level parse of reg expr */ --{ -- return (alt(concat(primary()))); --} -- --Node *primary(void) --{ -- Node *np; -- -- switch (rtok) { -- case CHAR: -- np = op2(CHAR, NIL, itonp(rlxval)); -- rtok = relex(); -- return (unary(np)); -- case ALL: -- rtok = relex(); -- return (unary(op2(ALL, NIL, NIL))); -- case DOT: -- rtok = relex(); -- return (unary(op2(DOT, NIL, NIL))); -- case CCL: -- np = op2(CCL, NIL, (Node*) cclenter((char *) rlxstr)); -- rtok = relex(); -- return (unary(np)); -- case NCCL: -- np = op2(NCCL, NIL, (Node *) cclenter((char *) rlxstr)); -- rtok = relex(); -- return (unary(np)); -- case '^': -- rtok = relex(); -- return (unary(op2(CHAR, NIL, itonp(HAT)))); -- case '$': -- rtok = relex(); -- return (unary(op2(CHAR, NIL, NIL))); -- case '(': -- rtok = relex(); -- if (rtok == ')') { /* special pleading for () */ -- rtok = relex(); -- return unary(op2(CCL, NIL, (Node *) tostring(""))); -- } -- np = regexp(); -- if (rtok == ')') { -- rtok = relex(); -- return (unary(np)); -- } -- else -- FATAL("syntax error in regular expression %s at %s", lastre, prestr); -- default: -- FATAL("illegal primary in regular expression %s at %s", lastre, prestr); -- } -- return 0; /*NOTREACHED*/ --} -- --Node *concat(Node *np) --{ -- switch (rtok) { -- case CHAR: case DOT: case ALL: case CCL: case NCCL: case '$': case '(': -- return (concat(op2(CAT, np, primary()))); -- } -- return (np); --} -- --Node *alt(Node *np) --{ -- if (rtok == OR) { -- rtok = relex(); -- return (alt(op2(OR, np, concat(primary())))); -- } -- return (np); --} -- --Node *unary(Node *np) --{ -- switch (rtok) { -- case STAR: -- rtok = relex(); -- return (unary(op2(STAR, np, NIL))); -- case PLUS: -- rtok = relex(); -- return (unary(op2(PLUS, np, NIL))); -- case QUEST: -- rtok = relex(); -- return (unary(op2(QUEST, np, NIL))); -- default: -- return (np); -- } --} -- --/* -- * Character class definitions conformant to the POSIX locale as -- * defined in IEEE P1003.1 draft 7 of June 2001, assuming the source -- * and operating character sets are both ASCII (ISO646) or supersets -- * thereof. -- * -- * Note that to avoid overflowing the temporary buffer used in -- * relex(), the expanded character class (prior to range expansion) -- * must be less than twice the size of their full name. -- */ -- --/* Because isblank doesn't show up in any of the header files on any -- * system i use, it's defined here. if some other locale has a richer -- * definition of "blank", define HAS_ISBLANK and provide your own -- * version. -- * the parentheses here are an attempt to find a path through the maze -- * of macro definition and/or function and/or version provided. thanks -- * to nelson beebe for the suggestion; let's see if it works everywhere. -- */ -- --#ifndef HAS_ISBLANK -- --int (isblank)(int c) --{ -- return c==' ' || c=='\t'; --} -- --#endif -- --struct charclass { -- const char *cc_name; -- int cc_namelen; -- int (*cc_func)(int); --} charclasses[] = { -- { "alnum", 5, isalnum }, -- { "alpha", 5, isalpha }, -- { "blank", 5, isblank }, -- { "cntrl", 5, iscntrl }, -- { "digit", 5, isdigit }, -- { "graph", 5, isgraph }, -- { "lower", 5, islower }, -- { "print", 5, isprint }, -- { "punct", 5, ispunct }, -- { "space", 5, isspace }, -- { "upper", 5, isupper }, -- { "xdigit", 6, isxdigit }, -- { NULL, 0, NULL }, --}; -- -- --int relex(void) /* lexical analyzer for reparse */ --{ -- int c, n; -- int cflag; -- static uschar *buf = 0; -- static int bufsz = 100; -- uschar *bp; -- struct charclass *cc; -- int i; -- -- switch (c = *prestr++) { -- case '|': return OR; -- case '*': return STAR; -- case '+': return PLUS; -- case '?': return QUEST; -- case '.': return DOT; -- case '\0': prestr--; return '\0'; -- case '^': -- case '$': -- case '(': -- case ')': -- return c; -- case '\\': -- rlxval = quoted((char **) &prestr); -- return CHAR; -- default: -- rlxval = c; -- return CHAR; -- case '[': -- if (buf == 0 && (buf = (uschar *) malloc(bufsz)) == NULL) -- FATAL("out of space in reg expr %.10s..", lastre); -- bp = buf; -- if (*prestr == '^') { -- cflag = 1; -- prestr++; -- } -- else -- cflag = 0; -- n = 2 * strlen((const char *) prestr)+1; -- if (!adjbuf((char **) &buf, &bufsz, n, n, (char **) &bp, 0)) -- FATAL("out of space for reg expr %.10s...", lastre); -- for (; ; ) { -- if ((c = *prestr++) == '\\') { -- *bp++ = '\\'; -- if ((c = *prestr++) == '\0') -- FATAL("nonterminated character class %.20s...", lastre); -- *bp++ = c; -- /* } else if (c == '\n') { */ -- /* FATAL("newline in character class %.20s...", lastre); */ -- } else if (c == '[' && *prestr == ':') { -- /* POSIX char class names, Dag-Erling Smorgrav, des@ofug.org */ -- for (cc = charclasses; cc->cc_name; cc++) -- if (strncmp((const char *) prestr + 1, (const char *) cc->cc_name, cc->cc_namelen) == 0) -- break; -- if (cc->cc_name != NULL && prestr[1 + cc->cc_namelen] == ':' && -- prestr[2 + cc->cc_namelen] == ']') { -- prestr += cc->cc_namelen + 3; -- for (i = 0; i < NCHARS; i++) { -- if (!adjbuf((char **) &buf, &bufsz, bp-buf+1, 100, (char **) &bp, 0)) -- FATAL("out of space for reg expr %.10s...", lastre); -- if (cc->cc_func(i)) { -- *bp++ = i; -- n++; -- } -- } -- } else -- *bp++ = c; -- } else if (c == '\0') { -- FATAL("nonterminated character class %.20s", lastre); -- } else if (bp == buf) { /* 1st char is special */ -- *bp++ = c; -- } else if (c == ']') { -- *bp++ = 0; -- rlxstr = (uschar *) tostring((char *) buf); -- if (cflag == 0) -- return CCL; -- else -- return NCCL; -- } else -- *bp++ = c; -- } -- } --} -- --int cgoto(fa *f, int s, int c) --{ -- int i, j, k; -- int *p, *q; -- -- assert(c == HAT || c < NCHARS); -- while (f->accept >= maxsetvec) { /* guessing here! */ -- maxsetvec *= 4; -- setvec = (int *) realloc(setvec, maxsetvec * sizeof(int)); -- tmpset = (int *) realloc(tmpset, maxsetvec * sizeof(int)); -- if (setvec == 0 || tmpset == 0) -- overflo("out of space in cgoto()"); -- } -- for (i = 0; i <= f->accept; i++) -- setvec[i] = 0; -- setcnt = 0; -- /* compute positions of gototab[s,c] into setvec */ -- p = f->posns[s]; -- for (i = 1; i <= *p; i++) { -- if ((k = f->re[p[i]].ltype) != FINAL) { -- if ((k == CHAR && c == ptoi(f->re[p[i]].lval.np)) -- || (k == DOT && c != 0 && c != HAT) -- || (k == ALL && c != 0) -- || (k == CCL && member(c, (char *) f->re[p[i]].lval.up)) -- || (k == NCCL && !member(c, (char *) f->re[p[i]].lval.up) && c != 0 && c != HAT)) { -- q = f->re[p[i]].lfollow; -- for (j = 1; j <= *q; j++) { -- if (q[j] >= maxsetvec) { -- maxsetvec *= 4; -- setvec = (int *) realloc(setvec, maxsetvec * sizeof(int)); -- tmpset = (int *) realloc(setvec, maxsetvec * sizeof(int)); -- if (setvec == 0 || tmpset == 0) -- overflo("cgoto overflow"); -- } -- if (setvec[q[j]] == 0) { -- setcnt++; -- setvec[q[j]] = 1; -- } -- } -- } -- } -- } -- /* determine if setvec is a previous state */ -- tmpset[0] = setcnt; -- j = 1; -- for (i = f->accept; i >= 0; i--) -- if (setvec[i]) { -- tmpset[j++] = i; -- } -- /* tmpset == previous state? */ -- for (i = 1; i <= f->curstat; i++) { -- p = f->posns[i]; -- if ((k = tmpset[0]) != p[0]) -- goto different; -- for (j = 1; j <= k; j++) -- if (tmpset[j] != p[j]) -- goto different; -- /* setvec is state i */ -- f->gototab[s][c] = i; -- return i; -- different:; -- } -- -- /* add tmpset to current set of states */ -- if (f->curstat >= NSTATES-1) { -- f->curstat = 2; -- f->reset = 1; -- for (i = 2; i < NSTATES; i++) -- xfree(f->posns[i]); -- } else -- ++(f->curstat); -- for (i = 0; i < NCHARS; i++) -- f->gototab[f->curstat][i] = 0; -- xfree(f->posns[f->curstat]); -- if ((p = (int *) calloc(1, (setcnt+1)*sizeof(int))) == NULL) -- overflo("out of space in cgoto"); -- -- f->posns[f->curstat] = p; -- f->gototab[s][c] = f->curstat; -- for (i = 0; i <= setcnt; i++) -- p[i] = tmpset[i]; -- if (setvec[f->accept]) -- f->out[f->curstat] = 1; -- else -- f->out[f->curstat] = 0; -- return f->curstat; --} -- -- --void freefa(fa *f) /* free a finite automaton */ --{ -- int i; -- -- if (f == NULL) -- return; -- for (i = 0; i <= f->curstat; i++) -- xfree(f->posns[i]); -- for (i = 0; i <= f->accept; i++) { -- xfree(f->re[i].lfollow); -- if (f->re[i].ltype == CCL || f->re[i].ltype == NCCL) -- xfree((f->re[i].lval.np)); -- } -- xfree(f->restr); -- xfree(f); --} -//GO.SYSIN DD b.c -echo main.c 1>&2 -sed 's/.//' >main.c <<'//GO.SYSIN DD main.c' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --const char *version = "version 20050424"; -- --#define DEBUG --#include <stdio.h> --#include <ctype.h> --#include <locale.h> --#include <stdlib.h> --#include <string.h> --#include <signal.h> --#include "awk.h" --#include "ytab.h" -- --extern char **environ; --extern int nfields; -- --int dbg = 0; --char *cmdname; /* gets argv[0] for error messages */ --extern FILE *yyin; /* lex input file */ --char *lexprog; /* points to program argument if it exists */ --extern int errorflag; /* non-zero if any syntax errors; set by yyerror */ --int compile_time = 2; /* for error printing: */ -- /* 2 = cmdline, 1 = compile, 0 = running */ -- --#define MAX_PFILE 20 /* max number of -f's */ -- --char *pfile[MAX_PFILE]; /* program filenames from -f's */ --int npfile = 0; /* number of filenames */ --int curpfile = 0; /* current filename */ -- --int safe = 0; /* 1 => "safe" mode */ -- --int main(int argc, char *argv[]) --{ -- const char *fs = NULL; -- -- setlocale(LC_CTYPE, ""); -- setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */ -- cmdname = argv[0]; -- if (argc == 1) { -- fprintf(stderr, "Usage: %s [-f programfile | 'program'] [-Ffieldsep] [-v var=value] [files]\n", cmdname); -- exit(1); -- } -- signal(SIGFPE, fpecatch); -- yyin = NULL; -- symtab = makesymtab(NSYMTAB); -- while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { -- if (strcmp(argv[1], "--") == 0) { /* explicit end of args */ -- argc--; -- argv++; -- break; -- } -- switch (argv[1][1]) { -- case 's': -- if (strcmp(argv[1], "-safe") == 0) -- safe = 1; -- break; -- case 'f': /* next argument is program filename */ -- argc--; -- argv++; -- if (argc <= 1) -- FATAL("no program filename"); -- if (npfile >= MAX_PFILE - 1) -- FATAL("too many -f options"); -- pfile[npfile++] = argv[1]; -- break; -- case 'F': /* set field separator */ -- if (argv[1][2] != 0) { /* arg is -Fsomething */ -- if (argv[1][2] == 't' && argv[1][3] == 0) /* wart: t=>\t */ -- fs = "\t"; -- else if (argv[1][2] != 0) -- fs = &argv[1][2]; -- } else { /* arg is -F something */ -- argc--; argv++; -- if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0) /* wart: t=>\t */ -- fs = "\t"; -- else if (argc > 1 && argv[1][0] != 0) -- fs = &argv[1][0]; -- } -- if (fs == NULL || *fs == '\0') -- WARNING("field separator FS is empty"); -- break; -- case 'v': /* -v a=1 to be done NOW. one -v for each */ -- if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) -- setclvar(argv[1]); -- break; -- case 'm': /* more memory: -mr=record, -mf=fields */ -- /* no longer supported */ -- WARNING("obsolete option %s ignored", argv[1]); -- break; -- case 'd': -- dbg = atoi(&argv[1][2]); -- if (dbg == 0) -- dbg = 1; -- printf("awk %s\n", version); -- break; -- case 'V': /* added for exptools "standard" */ -- printf("awk %s\n", version); -- exit(0); -- break; -- default: -- WARNING("unknown option %s ignored", argv[1]); -- break; -- } -- argc--; -- argv++; -- } -- /* argv[1] is now the first argument */ -- if (npfile == 0) { /* no -f; first argument is program */ -- if (argc <= 1) { -- if (dbg) -- exit(0); -- FATAL("no program given"); -- } -- dprintf( ("program = |%s|\n", argv[1]) ); -- lexprog = argv[1]; -- argc--; -- argv++; -- } -- recinit(recsize); -- syminit(); -- compile_time = 1; -- argv[0] = cmdname; /* put prog name at front of arglist */ -- dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) ); -- arginit(argc, argv); -- if (!safe) -- envinit(environ); -- yyparse(); -- setlocale(LC_NUMERIC, ""); /* back to whatever it is locally */ -- if (fs) -- *FS = qstring(fs, '\0'); -- dprintf( ("errorflag=%d\n", errorflag) ); -- if (errorflag == 0) { -- compile_time = 0; -- run(winner); -- } else -- bracecheck(); -- return(errorflag); --} -- --int pgetc(void) /* get 1 character from awk program */ --{ -- int c; -- -- for (;;) { -- if (yyin == NULL) { -- if (curpfile >= npfile) -- return EOF; -- if (strcmp(pfile[curpfile], "-") == 0) -- yyin = stdin; -- else if ((yyin = fopen(pfile[curpfile], "r")) == NULL) -- FATAL("can't open file %s", pfile[curpfile]); -- lineno = 1; -- } -- if ((c = getc(yyin)) != EOF) -- return c; -- if (yyin != stdin) -- fclose(yyin); -- yyin = NULL; -- curpfile++; -- } --} -- --char *cursource(void) /* current source file name */ --{ -- if (npfile > 0) -- return pfile[curpfile]; -- else -- return NULL; --} -//GO.SYSIN DD main.c -echo maketab.c 1>&2 -sed 's/.//' >maketab.c <<'//GO.SYSIN DD maketab.c' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --/* -- * this program makes the table to link function names -- * and type indices that is used by execute() in run.c. -- * it finds the indices in ytab.h, produced by yacc. -- */ -- --#include <stdio.h> --#include <string.h> --#include <stdlib.h> --#include "awk.h" --#include "ytab.h" -- --struct xx --{ int token; -- const char *name; -- const char *pname; --} proc[] = { -- { PROGRAM, "program", NULL }, -- { BOR, "boolop", " || " }, -- { AND, "boolop", " && " }, -- { NOT, "boolop", " !" }, -- { NE, "relop", " != " }, -- { EQ, "relop", " == " }, -- { LE, "relop", " <= " }, -- { LT, "relop", " < " }, -- { GE, "relop", " >= " }, -- { GT, "relop", " > " }, -- { ARRAY, "array", NULL }, -- { INDIRECT, "indirect", "$(" }, -- { SUBSTR, "substr", "substr" }, -- { SUB, "sub", "sub" }, -- { GSUB, "gsub", "gsub" }, -- { INDEX, "sindex", "sindex" }, -- { SPRINTF, "awksprintf", "sprintf " }, -- { ADD, "arith", " + " }, -- { MINUS, "arith", " - " }, -- { MULT, "arith", " * " }, -- { DIVIDE, "arith", " / " }, -- { MOD, "arith", " % " }, -- { UMINUS, "arith", " -" }, -- { POWER, "arith", " **" }, -- { PREINCR, "incrdecr", "++" }, -- { POSTINCR, "incrdecr", "++" }, -- { PREDECR, "incrdecr", "--" }, -- { POSTDECR, "incrdecr", "--" }, -- { CAT, "cat", " " }, -- { PASTAT, "pastat", NULL }, -- { PASTAT2, "dopa2", NULL }, -- { MATCH, "matchop", " ~ " }, -- { NOTMATCH, "matchop", " !~ " }, -- { MATCHFCN, "matchop", "matchop" }, -- { INTEST, "intest", "intest" }, -- { PRINTF, "awkprintf", "printf" }, -- { PRINT, "printstat", "print" }, -- { CLOSE, "closefile", "closefile" }, -- { DELETE, "awkdelete", "awkdelete" }, -- { SPLIT, "split", "split" }, -- { ASSIGN, "assign", " = " }, -- { ADDEQ, "assign", " += " }, -- { SUBEQ, "assign", " -= " }, -- { MULTEQ, "assign", " *= " }, -- { DIVEQ, "assign", " /= " }, -- { MODEQ, "assign", " %= " }, -- { POWEQ, "assign", " ^= " }, -- { CONDEXPR, "condexpr", " ?: " }, -- { IF, "ifstat", "if(" }, -- { WHILE, "whilestat", "while(" }, -- { FOR, "forstat", "for(" }, -- { DO, "dostat", "do" }, -- { IN, "instat", "instat" }, -- { NEXT, "jump", "next" }, -- { NEXTFILE, "jump", "nextfile" }, -- { EXIT, "jump", "exit" }, -- { BREAK, "jump", "break" }, -- { CONTINUE, "jump", "continue" }, -- { RETURN, "jump", "ret" }, -- { BLTIN, "bltin", "bltin" }, -- { CALL, "call", "call" }, -- { ARG, "arg", "arg" }, -- { VARNF, "getnf", "NF" }, -- { GETLINE, "getline", "getline" }, -- { 0, "", "" }, --}; -- --#define SIZE (LASTTOKEN - FIRSTTOKEN + 1) --const char *table[SIZE]; --char *names[SIZE]; -- --int main(int argc, char *argv[]) --{ -- const struct xx *p; -- int i, n, tok; -- char c; -- FILE *fp; -- char buf[200], name[200], def[200]; -- -- printf("#include <stdio.h>\n"); -- printf("#include \"awk.h\"\n"); -- printf("#include \"ytab.h\"\n\n"); -- for (i = SIZE; --i >= 0; ) -- names[i] = ""; -- -- if ((fp = fopen("ytab.h", "r")) == NULL) { -- fprintf(stderr, "maketab can't open ytab.h!\n"); -- exit(1); -- } -- printf("static char *printname[%d] = {\n", SIZE); -- i = 0; -- while (fgets(buf, sizeof buf, fp) != NULL) { -- n = sscanf(buf, "%1c %s %s %d", &c, def, name, &tok); -- if (c != '#' || (n != 4 && strcmp(def,"define") != 0)) /* not a valid #define */ -- continue; -- if (tok < FIRSTTOKEN || tok > LASTTOKEN) { -- fprintf(stderr, "maketab funny token %d %s ignored\n", tok, buf); -- continue; -- } -- names[tok-FIRSTTOKEN] = (char *) malloc(strlen(name)+1); -- strcpy(names[tok-FIRSTTOKEN], name); -- printf("\t(char *) \"%s\",\t/* %d */\n", name, tok); -- i++; -- } -- printf("};\n\n"); -- -- for (p=proc; p->token!=0; p++) -- table[p->token-FIRSTTOKEN] = p->name; -- printf("\nCell *(*proctab[%d])(Node **, int) = {\n", SIZE); -- for (i=0; i<SIZE; i++) -- if (table[i]==0) -- printf("\tnullproc,\t/* %s */\n", names[i]); -- else -- printf("\t%s,\t/* %s */\n", table[i], names[i]); -- printf("};\n\n"); -- -- printf("char *tokname(int n)\n"); /* print a tokname() function */ -- printf("{\n"); -- printf(" static char buf[100];\n\n"); -- printf(" if (n < FIRSTTOKEN || n > LASTTOKEN) {\n"); -- printf(" sprintf(buf, \"token %%d\", n);\n"); -- printf(" return buf;\n"); -- printf(" }\n"); -- printf(" return printname[n-FIRSTTOKEN];\n"); -- printf("}\n"); -- return 0; --} -//GO.SYSIN DD maketab.c -echo parse.c 1>&2 -sed 's/.//' >parse.c <<'//GO.SYSIN DD parse.c' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --#define DEBUG --#include <stdio.h> --#include <string.h> --#include <stdlib.h> --#include "awk.h" --#include "ytab.h" -- --Node *nodealloc(int n) --{ -- Node *x; -- -- x = (Node *) malloc(sizeof(Node) + (n-1)*sizeof(Node *)); -- if (x == NULL) -- FATAL("out of space in nodealloc"); -- x->nnext = NULL; -- x->lineno = lineno; -- return(x); --} -- --Node *exptostat(Node *a) --{ -- a->ntype = NSTAT; -- return(a); --} -- --Node *node1(int a, Node *b) --{ -- Node *x; -- -- x = nodealloc(1); -- x->nobj = a; -- x->narg[0]=b; -- return(x); --} -- --Node *node2(int a, Node *b, Node *c) --{ -- Node *x; -- -- x = nodealloc(2); -- x->nobj = a; -- x->narg[0] = b; -- x->narg[1] = c; -- return(x); --} -- --Node *node3(int a, Node *b, Node *c, Node *d) --{ -- Node *x; -- -- x = nodealloc(3); -- x->nobj = a; -- x->narg[0] = b; -- x->narg[1] = c; -- x->narg[2] = d; -- return(x); --} -- --Node *node4(int a, Node *b, Node *c, Node *d, Node *e) --{ -- Node *x; -- -- x = nodealloc(4); -- x->nobj = a; -- x->narg[0] = b; -- x->narg[1] = c; -- x->narg[2] = d; -- x->narg[3] = e; -- return(x); --} -- --Node *stat1(int a, Node *b) --{ -- Node *x; -- -- x = node1(a,b); -- x->ntype = NSTAT; -- return(x); --} -- --Node *stat2(int a, Node *b, Node *c) --{ -- Node *x; -- -- x = node2(a,b,c); -- x->ntype = NSTAT; -- return(x); --} -- --Node *stat3(int a, Node *b, Node *c, Node *d) --{ -- Node *x; -- -- x = node3(a,b,c,d); -- x->ntype = NSTAT; -- return(x); --} -- --Node *stat4(int a, Node *b, Node *c, Node *d, Node *e) --{ -- Node *x; -- -- x = node4(a,b,c,d,e); -- x->ntype = NSTAT; -- return(x); --} -- --Node *op1(int a, Node *b) --{ -- Node *x; -- -- x = node1(a,b); -- x->ntype = NEXPR; -- return(x); --} -- --Node *op2(int a, Node *b, Node *c) --{ -- Node *x; -- -- x = node2(a,b,c); -- x->ntype = NEXPR; -- return(x); --} -- --Node *op3(int a, Node *b, Node *c, Node *d) --{ -- Node *x; -- -- x = node3(a,b,c,d); -- x->ntype = NEXPR; -- return(x); --} -- --Node *op4(int a, Node *b, Node *c, Node *d, Node *e) --{ -- Node *x; -- -- x = node4(a,b,c,d,e); -- x->ntype = NEXPR; -- return(x); --} -- --Node *celltonode(Cell *a, int b) --{ -- Node *x; -- -- a->ctype = OCELL; -- a->csub = b; -- x = node1(0, (Node *) a); -- x->ntype = NVALUE; -- return(x); --} -- --Node *rectonode(void) /* make $0 into a Node */ --{ -- extern Cell *literal0; -- return op1(INDIRECT, celltonode(literal0, CUNK)); --} -- --Node *makearr(Node *p) --{ -- Cell *cp; -- -- if (isvalue(p)) { -- cp = (Cell *) (p->narg[0]); -- if (isfcn(cp)) -- SYNTAX( "%s is a function, not an array", cp->nval ); -- else if (!isarr(cp)) { -- xfree(cp->sval); -- cp->sval = (char *) makesymtab(NSYMTAB); -- cp->tval = ARR; -- } -- } -- return p; --} -- --#define PA2NUM 50 /* max number of pat,pat patterns allowed */ --int paircnt; /* number of them in use */ --int pairstack[PA2NUM]; /* state of each pat,pat */ -- --Node *pa2stat(Node *a, Node *b, Node *c) /* pat, pat {...} */ --{ -- Node *x; -- -- x = node4(PASTAT2, a, b, c, itonp(paircnt)); -- if (paircnt++ >= PA2NUM) -- SYNTAX( "limited to %d pat,pat statements", PA2NUM ); -- x->ntype = NSTAT; -- return(x); --} -- --Node *linkum(Node *a, Node *b) --{ -- Node *c; -- -- if (errorflag) /* don't link things that are wrong */ -- return a; -- if (a == NULL) -- return(b); -- else if (b == NULL) -- return(a); -- for (c = a; c->nnext != NULL; c = c->nnext) -- ; -- c->nnext = b; -- return(a); --} -- --void defn(Cell *v, Node *vl, Node *st) /* turn on FCN bit in definition, */ --{ /* body of function, arglist */ -- Node *p; -- int n; -- -- if (isarr(v)) { -- SYNTAX( "`%s' is an array name and a function name", v->nval ); -- return; -- } -- if (isarg(v->nval) != -1) { -- SYNTAX( "`%s' is both function name and argument name", v->nval ); -- return; -- } -- -- v->tval = FCN; -- v->sval = (char *) st; -- n = 0; /* count arguments */ -- for (p = vl; p; p = p->nnext) -- n++; -- v->fval = n; -- dprintf( ("defining func %s (%d args)\n", v->nval, n) ); --} -- --int isarg(const char *s) /* is s in argument list for current function? */ --{ /* return -1 if not, otherwise arg # */ -- extern Node *arglist; -- Node *p = arglist; -- int n; -- -- for (n = 0; p != 0; p = p->nnext, n++) -- if (strcmp(((Cell *)(p->narg[0]))->nval, s) == 0) -- return n; -- return -1; --} -- --int ptoi(void *p) /* convert pointer to integer */ --{ -- return (int) (long) p; /* swearing that p fits, of course */ --} -- --Node *itonp(int i) /* and vice versa */ --{ -- return (Node *) (long) i; --} -//GO.SYSIN DD parse.c -echo lib.c 1>&2 -sed 's/.//' >lib.c <<'//GO.SYSIN DD lib.c' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --#define DEBUG --#include <stdio.h> --#include <string.h> --#include <ctype.h> --#include <errno.h> --#include <stdlib.h> --#include <stdarg.h> --#include "awk.h" --#include "ytab.h" -- --FILE *infile = NULL; --char *file = ""; --char *record; --int recsize = RECSIZE; --char *fields; --int fieldssize = RECSIZE; -- --Cell **fldtab; /* pointers to Cells */ --char inputFS[100] = " "; -- --#define MAXFLD 200 --int nfields = MAXFLD; /* last allocated slot for $i */ -- --int donefld; /* 1 = implies rec broken into fields */ --int donerec; /* 1 = record is valid (no flds have changed) */ -- --int lastfld = 0; /* last used field */ --int argno = 1; /* current input argument number */ --extern Awkfloat *ARGC; -- --static Cell dollar0 = { OCELL, CFLD, NULL, "", 0.0, REC|STR|DONTFREE }; --static Cell dollar1 = { OCELL, CFLD, NULL, "", 0.0, FLD|STR|DONTFREE }; -- --void recinit(unsigned int n) --{ -- if ( (record = (char *) malloc(n)) == NULL -- || (fields = (char *) malloc(n)) == NULL -- || (fldtab = (Cell **) malloc((nfields+1) * sizeof(Cell *))) == NULL -- || (fldtab[0] = (Cell *) malloc(sizeof(Cell))) == NULL ) -- FATAL("out of space for $0 and fields"); -- *fldtab[0] = dollar0; -- fldtab[0]->sval = record; -- fldtab[0]->nval = tostring("0"); -- makefields(1, nfields); --} -- --void makefields(int n1, int n2) /* create $n1..$n2 inclusive */ --{ -- char temp[50]; -- int i; -- -- for (i = n1; i <= n2; i++) { -- fldtab[i] = (Cell *) malloc(sizeof (struct Cell)); -- if (fldtab[i] == NULL) -- FATAL("out of space in makefields %d", i); -- *fldtab[i] = dollar1; -- sprintf(temp, "%d", i); -- fldtab[i]->nval = tostring(temp); -- } --} -- --void initgetrec(void) --{ -- int i; -- char *p; -- -- for (i = 1; i < *ARGC; i++) { -- if (!isclvar(p = getargv(i))) { /* find 1st real filename */ -- setsval(lookup("FILENAME", symtab), getargv(i)); -- return; -- } -- setclvar(p); /* a commandline assignment before filename */ -- argno++; -- } -- infile = stdin; /* no filenames, so use stdin */ --} -- --static int firsttime = 1; -- --int getrec(char **pbuf, int *pbufsize, int isrecord) /* get next input record */ --{ /* note: cares whether buf == record */ -- int c; -- char *buf = *pbuf; -- uschar saveb0; -- int bufsize = *pbufsize, savebufsize = bufsize; -- -- if (firsttime) { -- firsttime = 0; -- initgetrec(); -- } -- dprintf( ("RS=<%s>, FS=<%s>, ARGC=%g, FILENAME=%s\n", -- *RS, *FS, *ARGC, *FILENAME) ); -- if (isrecord) { -- donefld = 0; -- donerec = 1; -- } -- saveb0 = buf[0]; -- buf[0] = 0; -- while (argno < *ARGC || infile == stdin) { -- dprintf( ("argno=%d, file=|%s|\n", argno, file) ); -- if (infile == NULL) { /* have to open a new file */ -- file = getargv(argno); -- if (*file == '\0') { /* it's been zapped */ -- argno++; -- continue; -- } -- if (isclvar(file)) { /* a var=value arg */ -- setclvar(file); -- argno++; -- continue; -- } -- *FILENAME = file; -- dprintf( ("opening file %s\n", file) ); -- if (*file == '-' && *(file+1) == '\0') -- infile = stdin; -- else if ((infile = fopen(file, "r")) == NULL) -- FATAL("can't open file %s", file); -- setfval(fnrloc, 0.0); -- } -- c = readrec(&buf, &bufsize, infile); -- if (c != 0 || buf[0] != '\0') { /* normal record */ -- if (isrecord) { -- if (freeable(fldtab[0])) -- xfree(fldtab[0]->sval); -- fldtab[0]->sval = buf; /* buf == record */ -- fldtab[0]->tval = REC | STR | DONTFREE; -- if (is_number(fldtab[0]->sval)) { -- fldtab[0]->fval = atof(fldtab[0]->sval); -- fldtab[0]->tval |= NUM; -- } -- } -- setfval(nrloc, nrloc->fval+1); -- setfval(fnrloc, fnrloc->fval+1); -- *pbuf = buf; -- *pbufsize = bufsize; -- return 1; -- } -- /* EOF arrived on this file; set up next */ -- if (infile != stdin) -- fclose(infile); -- infile = NULL; -- argno++; -- } -- buf[0] = saveb0; -- *pbuf = buf; -- *pbufsize = savebufsize; -- return 0; /* true end of file */ --} -- --void nextfile(void) --{ -- if (infile != stdin) -- fclose(infile); -- infile = NULL; -- argno++; --} -- --int readrec(char **pbuf, int *pbufsize, FILE *inf) /* read one record into buf */ --{ -- int sep, c; -- char *rr, *buf = *pbuf; -- int bufsize = *pbufsize; -- -- if (strlen(*FS) >= sizeof(inputFS)) -- FATAL("field separator %.10s... is too long", *FS); -- strcpy(inputFS, *FS); /* for subsequent field splitting */ -- if ((sep = **RS) == 0) { -- sep = '\n'; -- while ((c=getc(inf)) == '\n' && c != EOF) /* skip leading \n's */ -- ; -- if (c != EOF) -- ungetc(c, inf); -- } -- for (rr = buf; ; ) { -- for (; (c=getc(inf)) != sep && c != EOF; ) { -- if (rr-buf+1 > bufsize) -- if (!adjbuf(&buf, &bufsize, 1+rr-buf, recsize, &rr, "readrec 1")) -- FATAL("input record `%.30s...' too long", buf); -- *rr++ = c; -- } -- if (**RS == sep || c == EOF) -- break; -- if ((c = getc(inf)) == '\n' || c == EOF) /* 2 in a row */ -- break; -- if (!adjbuf(&buf, &bufsize, 2+rr-buf, recsize, &rr, "readrec 2")) -- FATAL("input record `%.30s...' too long", buf); -- *rr++ = '\n'; -- *rr++ = c; -- } -- if (!adjbuf(&buf, &bufsize, 1+rr-buf, recsize, &rr, "readrec 3")) -- FATAL("input record `%.30s...' too long", buf); -- *rr = 0; -- dprintf( ("readrec saw <%s>, returns %d\n", buf, c == EOF && rr == buf ? 0 : 1) ); -- *pbuf = buf; -- *pbufsize = bufsize; -- return c == EOF && rr == buf ? 0 : 1; --} -- --char *getargv(int n) /* get ARGV[n] */ --{ -- Cell *x; -- char *s, temp[50]; -- extern Array *ARGVtab; -- -- sprintf(temp, "%d", n); -- x = setsymtab(temp, "", 0.0, STR, ARGVtab); -- s = getsval(x); -- dprintf( ("getargv(%d) returns |%s|\n", n, s) ); -- return s; --} -- --void setclvar(char *s) /* set var=value from s */ --{ -- char *p; -- Cell *q; -- -- for (p=s; *p != '='; p++) -- ; -- *p++ = 0; -- p = qstring(p, '\0'); -- q = setsymtab(s, p, 0.0, STR, symtab); -- setsval(q, p); -- if (is_number(q->sval)) { -- q->fval = atof(q->sval); -- q->tval |= NUM; -- } -- dprintf( ("command line set %s to |%s|\n", s, p) ); --} -- -- --void fldbld(void) /* create fields from current record */ --{ -- /* this relies on having fields[] the same length as $0 */ -- /* the fields are all stored in this one array with \0's */ -- char *r, *fr, sep; -- Cell *p; -- int i, j, n; -- -- if (donefld) -- return; -- if (!isstr(fldtab[0])) -- getsval(fldtab[0]); -- r = fldtab[0]->sval; -- n = strlen(r); -- if (n > fieldssize) { -- xfree(fields); -- if ((fields = (char *) malloc(n+1)) == NULL) -- FATAL("out of space for fields in fldbld %d", n); -- fieldssize = n; -- } -- fr = fields; -- i = 0; /* number of fields accumulated here */ -- if (strlen(inputFS) > 1) { /* it's a regular expression */ -- i = refldbld(r, inputFS); -- } else if ((sep = *inputFS) == ' ') { /* default whitespace */ -- for (i = 0; ; ) { -- while (*r == ' ' || *r == '\t' || *r == '\n') -- r++; -- if (*r == 0) -- break; -- i++; -- if (i > nfields) -- growfldtab(i); -- if (freeable(fldtab[i])) -- xfree(fldtab[i]->sval); -- fldtab[i]->sval = fr; -- fldtab[i]->tval = FLD | STR | DONTFREE; -- do -- *fr++ = *r++; -- while (*r != ' ' && *r != '\t' && *r != '\n' && *r != '\0'); -- *fr++ = 0; -- } -- *fr = 0; -- } else if ((sep = *inputFS) == 0) { /* new: FS="" => 1 char/field */ -- for (i = 0; *r != 0; r++) { -- char buf[2]; -- i++; -- if (i > nfields) -- growfldtab(i); -- if (freeable(fldtab[i])) -- xfree(fldtab[i]->sval); -- buf[0] = *r; -- buf[1] = 0; -- fldtab[i]->sval = tostring(buf); -- fldtab[i]->tval = FLD | STR; -- } -- *fr = 0; -- } else if (*r != 0) { /* if 0, it's a null field */ -- /* subtlecase : if length(FS) == 1 && length(RS > 0) -- * \n is NOT a field separator (cf awk book 61,84). -- * this variable is tested in the inner while loop. -- */ -- int rtest = '\n'; /* normal case */ -- if (strlen(*RS) > 0) -- rtest = '\0'; -- for (;;) { -- i++; -- if (i > nfields) -- growfldtab(i); -- if (freeable(fldtab[i])) -- xfree(fldtab[i]->sval); -- fldtab[i]->sval = fr; -- fldtab[i]->tval = FLD | STR | DONTFREE; -- while (*r != sep && *r != rtest && *r != '\0') /* \n is always a separator */ -- *fr++ = *r++; -- *fr++ = 0; -- if (*r++ == 0) -- break; -- } -- *fr = 0; -- } -- if (i > nfields) -- FATAL("record `%.30s...' has too many fields; can't happen", r); -- cleanfld(i+1, lastfld); /* clean out junk from previous record */ -- lastfld = i; -- donefld = 1; -- for (j = 1; j <= lastfld; j++) { -- p = fldtab[j]; -- if(is_number(p->sval)) { -- p->fval = atof(p->sval); -- p->tval |= NUM; -- } -- } -- setfval(nfloc, (Awkfloat) lastfld); -- if (dbg) { -- for (j = 0; j <= lastfld; j++) { -- p = fldtab[j]; -- printf("field %d (%s): |%s|\n", j, p->nval, p->sval); -- } -- } --} -- --void cleanfld(int n1, int n2) /* clean out fields n1 .. n2 inclusive */ --{ /* nvals remain intact */ -- Cell *p; -- int i; -- -- for (i = n1; i <= n2; i++) { -- p = fldtab[i]; -- if (freeable(p)) -- xfree(p->sval); -- p->sval = ""; -- p->tval = FLD | STR | DONTFREE; -- } --} -- --void newfld(int n) /* add field n after end of existing lastfld */ --{ -- if (n > nfields) -- growfldtab(n); -- cleanfld(lastfld+1, n); -- lastfld = n; -- setfval(nfloc, (Awkfloat) n); --} -- --Cell *fieldadr(int n) /* get nth field */ --{ -- if (n < 0) -- FATAL("trying to access out of range field %d", n); -- if (n > nfields) /* fields after NF are empty */ -- growfldtab(n); /* but does not increase NF */ -- return(fldtab[n]); --} -- --void growfldtab(int n) /* make new fields up to at least $n */ --{ -- int nf = 2 * nfields; -- size_t s; -- -- if (n > nf) -- nf = n; -- s = (nf+1) * (sizeof (struct Cell *)); /* freebsd: how much do we need? */ -- if (s / sizeof(struct Cell *) - 1 == nf) /* didn't overflow */ -- fldtab = (Cell **) realloc(fldtab, s); -- else /* overflow sizeof int */ -- xfree(fldtab); /* make it null */ -- if (fldtab == NULL) -- FATAL("out of space creating %d fields", nf); -- makefields(nfields+1, nf); -- nfields = nf; --} -- --int refldbld(const char *rec, const char *fs) /* build fields from reg expr in FS */ --{ -- /* this relies on having fields[] the same length as $0 */ -- /* the fields are all stored in this one array with \0's */ -- char *fr; -- int i, tempstat, n; -- fa *pfa; -- -- n = strlen(rec); -- if (n > fieldssize) { -- xfree(fields); -- if ((fields = (char *) malloc(n+1)) == NULL) -- FATAL("out of space for fields in refldbld %d", n); -- fieldssize = n; -- } -- fr = fields; -- *fr = '\0'; -- if (*rec == '\0') -- return 0; -- pfa = makedfa(fs, 1); -- dprintf( ("into refldbld, rec = <%s>, pat = <%s>\n", rec, fs) ); -- tempstat = pfa->initstat; -- for (i = 1; ; i++) { -- if (i > nfields) -- growfldtab(i); -- if (freeable(fldtab[i])) -- xfree(fldtab[i]->sval); -- fldtab[i]->tval = FLD | STR | DONTFREE; -- fldtab[i]->sval = fr; -- dprintf( ("refldbld: i=%d\n", i) ); -- if (nematch(pfa, rec)) { -- pfa->initstat = 2; /* horrible coupling to b.c */ -- dprintf( ("match %s (%d chars)\n", patbeg, patlen) ); -- strncpy(fr, rec, patbeg-rec); -- fr += patbeg - rec + 1; -- *(fr-1) = '\0'; -- rec = patbeg + patlen; -- } else { -- dprintf( ("no match %s\n", rec) ); -- strcpy(fr, rec); -- pfa->initstat = tempstat; -- break; -- } -- } -- return i; --} -- --void recbld(void) /* create $0 from $1..$NF if necessary */ --{ -- int i; -- char *r, *p; -- -- if (donerec == 1) -- return; -- r = record; -- for (i = 1; i <= *NF; i++) { -- p = getsval(fldtab[i]); -- if (!adjbuf(&record, &recsize, 1+strlen(p)+r-record, recsize, &r, "recbld 1")) -- FATAL("created $0 `%.30s...' too long", record); -- while ((*r = *p++) != 0) -- r++; -- if (i < *NF) { -- if (!adjbuf(&record, &recsize, 2+strlen(*OFS)+r-record, recsize, &r, "recbld 2")) -- FATAL("created $0 `%.30s...' too long", record); -- for (p = *OFS; (*r = *p++) != 0; ) -- r++; -- } -- } -- if (!adjbuf(&record, &recsize, 2+r-record, recsize, &r, "recbld 3")) -- FATAL("built giant record `%.30s...'", record); -- *r = '\0'; -- dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); -- -- if (freeable(fldtab[0])) -- xfree(fldtab[0]->sval); -- fldtab[0]->tval = REC | STR | DONTFREE; -- fldtab[0]->sval = record; -- -- dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) ); -- dprintf( ("recbld = |%s|\n", record) ); -- donerec = 1; --} -- --int errorflag = 0; -- --void yyerror(const char *s) --{ -- SYNTAX("%s", s); --} -- --void SYNTAX(const char *fmt, ...) --{ -- extern char *cmdname, *curfname; -- static int been_here = 0; -- va_list varg; -- -- if (been_here++ > 2) -- return; -- fprintf(stderr, "%s: ", cmdname); -- va_start(varg, fmt); -- vfprintf(stderr, fmt, varg); -- va_end(varg); -- fprintf(stderr, " at source line %d", lineno); -- if (curfname != NULL) -- fprintf(stderr, " in function %s", curfname); -- if (compile_time == 1 && cursource() != NULL) -- fprintf(stderr, " source file %s", cursource()); -- fprintf(stderr, "\n"); -- errorflag = 2; -- eprint(); --} -- --void fpecatch(int n) --{ -- FATAL("floating point exception %d", n); --} -- --extern int bracecnt, brackcnt, parencnt; -- --void bracecheck(void) --{ -- int c; -- static int beenhere = 0; -- -- if (beenhere++) -- return; -- while ((c = input()) != EOF && c != '\0') -- bclass(c); -- bcheck2(bracecnt, '{', '}'); -- bcheck2(brackcnt, '[', ']'); -- bcheck2(parencnt, '(', ')'); --} -- --void bcheck2(int n, int c1, int c2) --{ -- if (n == 1) -- fprintf(stderr, "\tmissing %c\n", c2); -- else if (n > 1) -- fprintf(stderr, "\t%d missing %c's\n", n, c2); -- else if (n == -1) -- fprintf(stderr, "\textra %c\n", c2); -- else if (n < -1) -- fprintf(stderr, "\t%d extra %c's\n", -n, c2); --} -- --void FATAL(const char *fmt, ...) --{ -- extern char *cmdname; -- va_list varg; -- -- fflush(stdout); -- fprintf(stderr, "%s: ", cmdname); -- va_start(varg, fmt); -- vfprintf(stderr, fmt, varg); -- va_end(varg); -- error(); -- if (dbg > 1) /* core dump if serious debugging on */ -- abort(); -- exit(2); --} -- --void WARNING(const char *fmt, ...) --{ -- extern char *cmdname; -- va_list varg; -- -- fflush(stdout); -- fprintf(stderr, "%s: ", cmdname); -- va_start(varg, fmt); -- vfprintf(stderr, fmt, varg); -- va_end(varg); -- error(); --} -- --void error() --{ -- extern Node *curnode; -- -- fprintf(stderr, "\n"); -- if (compile_time != 2 && NR && *NR > 0) { -- fprintf(stderr, " input record number %d", (int) (*FNR)); -- if (strcmp(*FILENAME, "-") != 0) -- fprintf(stderr, ", file %s", *FILENAME); -- fprintf(stderr, "\n"); -- } -- if (compile_time != 2 && curnode) -- fprintf(stderr, " source line number %d", curnode->lineno); -- else if (compile_time != 2 && lineno) -- fprintf(stderr, " source line number %d", lineno); -- if (compile_time == 1 && cursource() != NULL) -- fprintf(stderr, " source file %s", cursource()); -- fprintf(stderr, "\n"); -- eprint(); --} -- --void eprint(void) /* try to print context around error */ --{ -- char *p, *q; -- int c; -- static int been_here = 0; -- extern char ebuf[], *ep; -- -- if (compile_time == 2 || compile_time == 0 || been_here++ > 0) -- return; -- p = ep - 1; -- if (p > ebuf && *p == '\n') -- p--; -- for ( ; p > ebuf && *p != '\n' && *p != '\0'; p--) -- ; -- while (*p == '\n') -- p++; -- fprintf(stderr, " context is\n\t"); -- for (q=ep-1; q>=p && *q!=' ' && *q!='\t' && *q!='\n'; q--) -- ; -- for ( ; p < q; p++) -- if (*p) -- putc(*p, stderr); -- fprintf(stderr, " >>> "); -- for ( ; p < ep; p++) -- if (*p) -- putc(*p, stderr); -- fprintf(stderr, " <<< "); -- if (*ep) -- while ((c = input()) != '\n' && c != '\0' && c != EOF) { -- putc(c, stderr); -- bclass(c); -- } -- putc('\n', stderr); -- ep = ebuf; --} -- --void bclass(int c) --{ -- switch (c) { -- case '{': bracecnt++; break; -- case '}': bracecnt--; break; -- case '[': brackcnt++; break; -- case ']': brackcnt--; break; -- case '(': parencnt++; break; -- case ')': parencnt--; break; -- } --} -- --double errcheck(double x, const char *s) --{ -- -- if (errno == EDOM) { -- errno = 0; -- WARNING("%s argument out of domain", s); -- x = 1; -- } else if (errno == ERANGE) { -- errno = 0; -- WARNING("%s result out of range", s); -- x = 1; -- } -- return x; --} -- --int isclvar(const char *s) /* is s of form var=something ? */ --{ -- const char *os = s; -- -- if (!isalpha((uschar) *s) && *s != '_') -- return 0; -- for ( ; *s; s++) -- if (!(isalnum((uschar) *s) || *s == '_')) -- break; -- return *s == '=' && s > os && *(s+1) != '='; --} -- --/* strtod is supposed to be a proper test of what's a valid number */ --/* appears to be broken in gcc on linux: thinks 0x123 is a valid FP number */ --/* wrong: violates 4.10.1.4 of ansi C standard */ -- --#include <math.h> --int is_number(const char *s) --{ -- double r; -- char *ep; -- errno = 0; -- r = strtod(s, &ep); -- if (ep == s || r == HUGE_VAL || errno == ERANGE) -- return 0; -- while (*ep == ' ' || *ep == '\t' || *ep == '\n') -- ep++; -- if (*ep == '\0') -- return 1; -- else -- return 0; --} -//GO.SYSIN DD lib.c -echo run.c 1>&2 -sed 's/.//' >run.c <<'//GO.SYSIN DD run.c' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --#define DEBUG --#include <stdio.h> --#include <ctype.h> --#include <setjmp.h> --#include <limits.h> --#include <math.h> --#include <string.h> --#include <stdlib.h> --#include <time.h> --#include "awk.h" --#include "ytab.h" -- --#define tempfree(x) if (istemp(x)) tfree(x); else -- --/* --#undef tempfree -- --void tempfree(Cell *p) { -- if (p->ctype == OCELL && (p->csub < CUNK || p->csub > CFREE)) { -- WARNING("bad csub %d in Cell %d %s", -- p->csub, p->ctype, p->sval); -- } -- if (istemp(p)) -- tfree(p); --} --*/ -- --#ifdef _NFILE --#ifndef FOPEN_MAX --#define FOPEN_MAX _NFILE --#endif --#endif -- --#ifndef FOPEN_MAX --#define FOPEN_MAX 40 /* max number of open files */ --#endif -- --#ifndef RAND_MAX --#define RAND_MAX 32767 /* all that ansi guarantees */ --#endif -- --jmp_buf env; --extern int pairstack[]; -- --Node *winner = NULL; /* root of parse tree */ --Cell *tmps; /* free temporary cells for execution */ -- --static Cell truecell ={ OBOOL, BTRUE, 0, 0, 1.0, NUM }; --Cell *True = &truecell; --static Cell falsecell ={ OBOOL, BFALSE, 0, 0, 0.0, NUM }; --Cell *False = &falsecell; --static Cell breakcell ={ OJUMP, JBREAK, 0, 0, 0.0, NUM }; --Cell *jbreak = &breakcell; --static Cell contcell ={ OJUMP, JCONT, 0, 0, 0.0, NUM }; --Cell *jcont = &contcell; --static Cell nextcell ={ OJUMP, JNEXT, 0, 0, 0.0, NUM }; --Cell *jnext = &nextcell; --static Cell nextfilecell ={ OJUMP, JNEXTFILE, 0, 0, 0.0, NUM }; --Cell *jnextfile = &nextfilecell; --static Cell exitcell ={ OJUMP, JEXIT, 0, 0, 0.0, NUM }; --Cell *jexit = &exitcell; --static Cell retcell ={ OJUMP, JRET, 0, 0, 0.0, NUM }; --Cell *jret = &retcell; --static Cell tempcell ={ OCELL, CTEMP, 0, "", 0.0, NUM|STR|DONTFREE }; -- --Node *curnode = NULL; /* the node being executed, for debugging */ -- --/* buffer memory management */ --int adjbuf(char **pbuf, int *psiz, int minlen, int quantum, char **pbptr, -- const char *whatrtn) --/* pbuf: address of pointer to buffer being managed -- * psiz: address of buffer size variable -- * minlen: minimum length of buffer needed -- * quantum: buffer size quantum -- * pbptr: address of movable pointer into buffer, or 0 if none -- * whatrtn: name of the calling routine if failure should cause fatal error -- * -- * return 0 for realloc failure, !=0 for success -- */ --{ -- if (minlen > *psiz) { -- char *tbuf; -- int rminlen = quantum ? minlen % quantum : 0; -- int boff = pbptr ? *pbptr - *pbuf : 0; -- /* round up to next multiple of quantum */ -- if (rminlen) -- minlen += quantum - rminlen; -- tbuf = (char *) realloc(*pbuf, minlen); -- if (tbuf == NULL) { -- if (whatrtn) -- FATAL("out of memory in %s", whatrtn); -- return 0; -- } -- *pbuf = tbuf; -- *psiz = minlen; -- if (pbptr) -- *pbptr = tbuf + boff; -- } -- return 1; --} -- --void run(Node *a) /* execution of parse tree starts here */ --{ -- extern void stdinit(void); -- -- stdinit(); -- execute(a); -- closeall(); --} -- --Cell *execute(Node *u) /* execute a node of the parse tree */ --{ -- Cell *(*proc)(Node **, int); -- Cell *x; -- Node *a; -- -- if (u == NULL) -- return(True); -- for (a = u; ; a = a->nnext) { -- curnode = a; -- if (isvalue(a)) { -- x = (Cell *) (a->narg[0]); -- if (isfld(x) && !donefld) -- fldbld(); -- else if (isrec(x) && !donerec) -- recbld(); -- return(x); -- } -- if (notlegal(a->nobj)) /* probably a Cell* but too risky to print */ -- FATAL("illegal statement"); -- proc = proctab[a->nobj-FIRSTTOKEN]; -- x = (*proc)(a->narg, a->nobj); -- if (isfld(x) && !donefld) -- fldbld(); -- else if (isrec(x) && !donerec) -- recbld(); -- if (isexpr(a)) -- return(x); -- if (isjump(x)) -- return(x); -- if (a->nnext == NULL) -- return(x); -- tempfree(x); -- } --} -- -- --Cell *program(Node **a, int n) /* execute an awk program */ --{ /* a[0] = BEGIN, a[1] = body, a[2] = END */ -- Cell *x; -- -- if (setjmp(env) != 0) -- goto ex; -- if (a[0]) { /* BEGIN */ -- x = execute(a[0]); -- if (isexit(x)) -- return(True); -- if (isjump(x)) -- FATAL("illegal break, continue, next or nextfile from BEGIN"); -- tempfree(x); -- } -- if (a[1] || a[2]) -- while (getrec(&record, &recsize, 1) > 0) { -- x = execute(a[1]); -- if (isexit(x)) -- break; -- tempfree(x); -- } -- ex: -- if (setjmp(env) != 0) /* handles exit within END */ -- goto ex1; -- if (a[2]) { /* END */ -- x = execute(a[2]); -- if (isbreak(x) || isnext(x) || iscont(x)) -- FATAL("illegal break, continue, next or nextfile from END"); -- tempfree(x); -- } -- ex1: -- return(True); --} -- --struct Frame { /* stack frame for awk function calls */ -- int nargs; /* number of arguments in this call */ -- Cell *fcncell; /* pointer to Cell for function */ -- Cell **args; /* pointer to array of arguments after execute */ -- Cell *retval; /* return value */ --}; -- --#define NARGS 50 /* max args in a call */ -- --struct Frame *frame = NULL; /* base of stack frames; dynamically allocated */ --int nframe = 0; /* number of frames allocated */ --struct Frame *fp = NULL; /* frame pointer. bottom level unused */ -- --Cell *call(Node **a, int n) /* function call. very kludgy and fragile */ --{ -- static Cell newcopycell = { OCELL, CCOPY, 0, "", 0.0, NUM|STR|DONTFREE }; -- int i, ncall, ndef; -- int freed = 0; /* handles potential double freeing when fcn & param share a tempcell */ -- Node *x; -- Cell *args[NARGS], *oargs[NARGS]; /* BUG: fixed size arrays */ -- Cell *y, *z, *fcn; -- char *s; -- -- fcn = execute(a[0]); /* the function itself */ -- s = fcn->nval; -- if (!isfcn(fcn)) -- FATAL("calling undefined function %s", s); -- if (frame == NULL) { -- fp = frame = (struct Frame *) calloc(nframe += 100, sizeof(struct Frame)); -- if (frame == NULL) -- FATAL("out of space for stack frames calling %s", s); -- } -- for (ncall = 0, x = a[1]; x != NULL; x = x->nnext) /* args in call */ -- ncall++; -- ndef = (int) fcn->fval; /* args in defn */ -- dprintf( ("calling %s, %d args (%d in defn), fp=%d\n", s, ncall, ndef, (int) (fp-frame)) ); -- if (ncall > ndef) -- WARNING("function %s called with %d args, uses only %d", -- s, ncall, ndef); -- if (ncall + ndef > NARGS) -- FATAL("function %s has %d arguments, limit %d", s, ncall+ndef, NARGS); -- for (i = 0, x = a[1]; x != NULL; i++, x = x->nnext) { /* get call args */ -- dprintf( ("evaluate args[%d], fp=%d:\n", i, (int) (fp-frame)) ); -- y = execute(x); -- oargs[i] = y; -- dprintf( ("args[%d]: %s %f <%s>, t=%o\n", -- i, NN(y->nval), y->fval, isarr(y) ? "(array)" : NN(y->sval), y->tval) ); -- if (isfcn(y)) -- FATAL("can't use function %s as argument in %s", y->nval, s); -- if (isarr(y)) -- args[i] = y; /* arrays by ref */ -- else -- args[i] = copycell(y); -- tempfree(y); -- } -- for ( ; i < ndef; i++) { /* add null args for ones not provided */ -- args[i] = gettemp(); -- *args[i] = newcopycell; -- } -- fp++; /* now ok to up frame */ -- if (fp >= frame + nframe) { -- int dfp = fp - frame; /* old index */ -- frame = (struct Frame *) -- realloc((char *) frame, (nframe += 100) * sizeof(struct Frame)); -- if (frame == NULL) -- FATAL("out of space for stack frames in %s", s); -- fp = frame + dfp; -- } -- fp->fcncell = fcn; -- fp->args = args; -- fp->nargs = ndef; /* number defined with (excess are locals) */ -- fp->retval = gettemp(); -- -- dprintf( ("start exec of %s, fp=%d\n", s, (int) (fp-frame)) ); -- y = execute((Node *)(fcn->sval)); /* execute body */ -- dprintf( ("finished exec of %s, fp=%d\n", s, (int) (fp-frame)) ); -- -- for (i = 0; i < ndef; i++) { -- Cell *t = fp->args[i]; -- if (isarr(t)) { -- if (t->csub == CCOPY) { -- if (i >= ncall) { -- freesymtab(t); -- t->csub = CTEMP; -- tempfree(t); -- } else { -- oargs[i]->tval = t->tval; -- oargs[i]->tval &= ~(STR|NUM|DONTFREE); -- oargs[i]->sval = t->sval; -- tempfree(t); -- } -- } -- } else if (t != y) { /* kludge to prevent freeing twice */ -- t->csub = CTEMP; -- tempfree(t); -- } else if (t == y && t->csub == CCOPY) { -- t->csub = CTEMP; -- tempfree(t); -- freed = 1; -- } -- } -- tempfree(fcn); -- if (isexit(y) || isnext(y)) -- return y; -- if (freed == 0) { -- tempfree(y); /* don't free twice! */ -- } -- z = fp->retval; /* return value */ -- dprintf( ("%s returns %g |%s| %o\n", s, getfval(z), getsval(z), z->tval) ); -- fp--; -- return(z); --} -- --Cell *copycell(Cell *x) /* make a copy of a cell in a temp */ --{ -- Cell *y; -- -- y = gettemp(); -- y->csub = CCOPY; /* prevents freeing until call is over */ -- y->nval = x->nval; /* BUG? */ -- if (isstr(x)) -- y->sval = tostring(x->sval); -- y->fval = x->fval; -- y->tval = x->tval & ~(CON|FLD|REC|DONTFREE); /* copy is not constant or field */ -- /* is DONTFREE right? */ -- return y; --} -- --Cell *arg(Node **a, int n) /* nth argument of a function */ --{ -- -- n = ptoi(a[0]); /* argument number, counting from 0 */ -- dprintf( ("arg(%d), fp->nargs=%d\n", n, fp->nargs) ); -- if (n+1 > fp->nargs) -- FATAL("argument #%d of function %s was not supplied", -- n+1, fp->fcncell->nval); -- return fp->args[n]; --} -- --Cell *jump(Node **a, int n) /* break, continue, next, nextfile, return */ --{ -- Cell *y; -- -- switch (n) { -- case EXIT: -- if (a[0] != NULL) { -- y = execute(a[0]); -- errorflag = (int) getfval(y); -- tempfree(y); -- } -- longjmp(env, 1); -- case RETURN: -- if (a[0] != NULL) { -- y = execute(a[0]); -- if ((y->tval & (STR|NUM)) == (STR|NUM)) { -- setsval(fp->retval, getsval(y)); -- fp->retval->fval = getfval(y); -- fp->retval->tval |= NUM; -- } -- else if (y->tval & STR) -- setsval(fp->retval, getsval(y)); -- else if (y->tval & NUM) -- setfval(fp->retval, getfval(y)); -- else /* can't happen */ -- FATAL("bad type variable %d", y->tval); -- tempfree(y); -- } -- return(jret); -- case NEXT: -- return(jnext); -- case NEXTFILE: -- nextfile(); -- return(jnextfile); -- case BREAK: -- return(jbreak); -- case CONTINUE: -- return(jcont); -- default: /* can't happen */ -- FATAL("illegal jump type %d", n); -- } -- return 0; /* not reached */ --} -- --Cell *getline(Node **a, int n) /* get next line from specific input */ --{ /* a[0] is variable, a[1] is operator, a[2] is filename */ -- Cell *r, *x; -- extern Cell **fldtab; -- FILE *fp; -- char *buf; -- int bufsize = recsize; -- int mode; -- -- if ((buf = (char *) malloc(bufsize)) == NULL) -- FATAL("out of memory in getline"); -- -- fflush(stdout); /* in case someone is waiting for a prompt */ -- r = gettemp(); -- if (a[1] != NULL) { /* getline < file */ -- x = execute(a[2]); /* filename */ -- mode = ptoi(a[1]); -- if (mode == '|') /* input pipe */ -- mode = LE; /* arbitrary flag */ -- fp = openfile(mode, getsval(x)); -- tempfree(x); -- if (fp == NULL) -- n = -1; -- else -- n = readrec(&buf, &bufsize, fp); -- if (n <= 0) { -- ; -- } else if (a[0] != NULL) { /* getline var <file */ -- x = execute(a[0]); -- setsval(x, buf); -- tempfree(x); -- } else { /* getline <file */ -- setsval(fldtab[0], buf); -- if (is_number(fldtab[0]->sval)) { -- fldtab[0]->fval = atof(fldtab[0]->sval); -- fldtab[0]->tval |= NUM; -- } -- } -- } else { /* bare getline; use current input */ -- if (a[0] == NULL) /* getline */ -- n = getrec(&record, &recsize, 1); -- else { /* getline var */ -- n = getrec(&buf, &bufsize, 0); -- x = execute(a[0]); -- setsval(x, buf); -- tempfree(x); -- } -- } -- setfval(r, (Awkfloat) n); -- free(buf); -- return r; --} -- --Cell *getnf(Node **a, int n) /* get NF */ --{ -- if (donefld == 0) -- fldbld(); -- return (Cell *) a[0]; --} -- --Cell *array(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts */ --{ -- Cell *x, *y, *z; -- char *s; -- Node *np; -- char *buf; -- int bufsz = recsize; -- int nsub = strlen(*SUBSEP); -- -- if ((buf = (char *) malloc(bufsz)) == NULL) -- FATAL("out of memory in array"); -- -- x = execute(a[0]); /* Cell* for symbol table */ -- buf[0] = 0; -- for (np = a[1]; np; np = np->nnext) { -- y = execute(np); /* subscript */ -- s = getsval(y); -- if (!adjbuf(&buf, &bufsz, strlen(buf)+strlen(s)+nsub+1, recsize, 0, 0)) -- FATAL("out of memory for %s[%s...]", x->nval, buf); -- strcat(buf, s); -- if (np->nnext) -- strcat(buf, *SUBSEP); -- tempfree(y); -- } -- if (!isarr(x)) { -- dprintf( ("making %s into an array\n", NN(x->nval)) ); -- if (freeable(x)) -- xfree(x->sval); -- x->tval &= ~(STR|NUM|DONTFREE); -- x->tval |= ARR; -- x->sval = (char *) makesymtab(NSYMTAB); -- } -- z = setsymtab(buf, "", 0.0, STR|NUM, (Array *) x->sval); -- z->ctype = OCELL; -- z->csub = CVAR; -- tempfree(x); -- free(buf); -- return(z); --} -- --Cell *awkdelete(Node **a, int n) /* a[0] is symtab, a[1] is list of subscripts */ --{ -- Cell *x, *y; -- Node *np; -- char *s; -- int nsub = strlen(*SUBSEP); -- -- x = execute(a[0]); /* Cell* for symbol table */ -- if (!isarr(x)) -- return True; -- if (a[1] == 0) { /* delete the elements, not the table */ -- freesymtab(x); -- x->tval &= ~STR; -- x->tval |= ARR; -- x->sval = (char *) makesymtab(NSYMTAB); -- } else { -- int bufsz = recsize; -- char *buf; -- if ((buf = (char *) malloc(bufsz)) == NULL) -- FATAL("out of memory in adelete"); -- buf[0] = 0; -- for (np = a[1]; np; np = np->nnext) { -- y = execute(np); /* subscript */ -- s = getsval(y); -- if (!adjbuf(&buf, &bufsz, strlen(buf)+strlen(s)+nsub+1, recsize, 0, 0)) -- FATAL("out of memory deleting %s[%s...]", x->nval, buf); -- strcat(buf, s); -- if (np->nnext) -- strcat(buf, *SUBSEP); -- tempfree(y); -- } -- freeelem(x, buf); -- free(buf); -- } -- tempfree(x); -- return True; --} -- --Cell *intest(Node **a, int n) /* a[0] is index (list), a[1] is symtab */ --{ -- Cell *x, *ap, *k; -- Node *p; -- char *buf; -- char *s; -- int bufsz = recsize; -- int nsub = strlen(*SUBSEP); -- -- ap = execute(a[1]); /* array name */ -- if (!isarr(ap)) { -- dprintf( ("making %s into an array\n", ap->nval) ); -- if (freeable(ap)) -- xfree(ap->sval); -- ap->tval &= ~(STR|NUM|DONTFREE); -- ap->tval |= ARR; -- ap->sval = (char *) makesymtab(NSYMTAB); -- } -- if ((buf = (char *) malloc(bufsz)) == NULL) { -- FATAL("out of memory in intest"); -- } -- buf[0] = 0; -- for (p = a[0]; p; p = p->nnext) { -- x = execute(p); /* expr */ -- s = getsval(x); -- if (!adjbuf(&buf, &bufsz, strlen(buf)+strlen(s)+nsub+1, recsize, 0, 0)) -- FATAL("out of memory deleting %s[%s...]", x->nval, buf); -- strcat(buf, s); -- tempfree(x); -- if (p->nnext) -- strcat(buf, *SUBSEP); -- } -- k = lookup(buf, (Array *) ap->sval); -- tempfree(ap); -- free(buf); -- if (k == NULL) -- return(False); -- else -- return(True); --} -- -- --Cell *matchop(Node **a, int n) /* ~ and match() */ --{ -- Cell *x, *y; -- char *s, *t; -- int i; -- fa *pfa; -- int (*mf)(fa *, const char *) = match, mode = 0; -- -- if (n == MATCHFCN) { -- mf = pmatch; -- mode = 1; -- } -- x = execute(a[1]); /* a[1] = target text */ -- s = getsval(x); -- if (a[0] == 0) /* a[1] == 0: already-compiled reg expr */ -- i = (*mf)((fa *) a[2], s); -- else { -- y = execute(a[2]); /* a[2] = regular expr */ -- t = getsval(y); -- pfa = makedfa(t, mode); -- i = (*mf)(pfa, s); -- tempfree(y); -- } -- tempfree(x); -- if (n == MATCHFCN) { -- int start = patbeg - s + 1; -- if (patlen < 0) -- start = 0; -- setfval(rstartloc, (Awkfloat) start); -- setfval(rlengthloc, (Awkfloat) patlen); -- x = gettemp(); -- x->tval = NUM; -- x->fval = start; -- return x; -- } else if ((n == MATCH && i == 1) || (n == NOTMATCH && i == 0)) -- return(True); -- else -- return(False); --} -- -- --Cell *boolop(Node **a, int n) /* a[0] || a[1], a[0] && a[1], !a[0] */ --{ -- Cell *x, *y; -- int i; -- -- x = execute(a[0]); -- i = istrue(x); -- tempfree(x); -- switch (n) { -- case BOR: -- if (i) return(True); -- y = execute(a[1]); -- i = istrue(y); -- tempfree(y); -- if (i) return(True); -- else return(False); -- case AND: -- if ( !i ) return(False); -- y = execute(a[1]); -- i = istrue(y); -- tempfree(y); -- if (i) return(True); -- else return(False); -- case NOT: -- if (i) return(False); -- else return(True); -- default: /* can't happen */ -- FATAL("unknown boolean operator %d", n); -- } -- return 0; /*NOTREACHED*/ --} -- --Cell *relop(Node **a, int n) /* a[0 < a[1], etc. */ --{ -- int i; -- Cell *x, *y; -- Awkfloat j; -- -- x = execute(a[0]); -- y = execute(a[1]); -- if (x->tval&NUM && y->tval&NUM) { -- j = x->fval - y->fval; -- i = j<0? -1: (j>0? 1: 0); -- } else { -- i = strcmp(getsval(x), getsval(y)); -- } -- tempfree(x); -- tempfree(y); -- switch (n) { -- case LT: if (i<0) return(True); -- else return(False); -- case LE: if (i<=0) return(True); -- else return(False); -- case NE: if (i!=0) return(True); -- else return(False); -- case EQ: if (i == 0) return(True); -- else return(False); -- case GE: if (i>=0) return(True); -- else return(False); -- case GT: if (i>0) return(True); -- else return(False); -- default: /* can't happen */ -- FATAL("unknown relational operator %d", n); -- } -- return 0; /*NOTREACHED*/ --} -- --void tfree(Cell *a) /* free a tempcell */ --{ -- if (freeable(a)) { -- dprintf( ("freeing %s %s %o\n", NN(a->nval), NN(a->sval), a->tval) ); -- xfree(a->sval); -- } -- if (a == tmps) -- FATAL("tempcell list is curdled"); -- a->cnext = tmps; -- tmps = a; --} -- --Cell *gettemp(void) /* get a tempcell */ --{ int i; -- Cell *x; -- -- if (!tmps) { -- tmps = (Cell *) calloc(100, sizeof(Cell)); -- if (!tmps) -- FATAL("out of space for temporaries"); -- for(i = 1; i < 100; i++) -- tmps[i-1].cnext = &tmps[i]; -- tmps[i-1].cnext = 0; -- } -- x = tmps; -- tmps = x->cnext; -- *x = tempcell; -- return(x); --} -- --Cell *indirect(Node **a, int n) /* $( a[0] ) */ --{ -- Awkfloat val; -- Cell *x; -- int m; -- char *s; -- -- x = execute(a[0]); -- val = getfval(x); /* freebsd: defend against super large field numbers */ -- if ((Awkfloat)INT_MAX < val) -- FATAL("trying to access out of range field %s", x->nval); -- m = (int) val; -- if (m == 0 && !is_number(s = getsval(x))) /* suspicion! */ -- FATAL("illegal field $(%s), name \"%s\"", s, x->nval); -- /* BUG: can x->nval ever be null??? */ -- tempfree(x); -- x = fieldadr(m); -- x->ctype = OCELL; /* BUG? why are these needed? */ -- x->csub = CFLD; -- return(x); --} -- --Cell *substr(Node **a, int nnn) /* substr(a[0], a[1], a[2]) */ --{ -- int k, m, n; -- char *s; -- int temp; -- Cell *x, *y, *z = 0; -- -- x = execute(a[0]); -- y = execute(a[1]); -- if (a[2] != 0) -- z = execute(a[2]); -- s = getsval(x); -- k = strlen(s) + 1; -- if (k <= 1) { -- tempfree(x); -- tempfree(y); -- if (a[2] != 0) { -- tempfree(z); -- } -- x = gettemp(); -- setsval(x, ""); -- return(x); -- } -- m = (int) getfval(y); -- if (m <= 0) -- m = 1; -- else if (m > k) -- m = k; -- tempfree(y); -- if (a[2] != 0) { -- n = (int) getfval(z); -- tempfree(z); -- } else -- n = k - 1; -- if (n < 0) -- n = 0; -- else if (n > k - m) -- n = k - m; -- dprintf( ("substr: m=%d, n=%d, s=%s\n", m, n, s) ); -- y = gettemp(); -- temp = s[n+m-1]; /* with thanks to John Linderman */ -- s[n+m-1] = '\0'; -- setsval(y, s + m - 1); -- s[n+m-1] = temp; -- tempfree(x); -- return(y); --} -- --Cell *sindex(Node **a, int nnn) /* index(a[0], a[1]) */ --{ -- Cell *x, *y, *z; -- char *s1, *s2, *p1, *p2, *q; -- Awkfloat v = 0.0; -- -- x = execute(a[0]); -- s1 = getsval(x); -- y = execute(a[1]); -- s2 = getsval(y); -- -- z = gettemp(); -- for (p1 = s1; *p1 != '\0'; p1++) { -- for (q=p1, p2=s2; *p2 != '\0' && *q == *p2; q++, p2++) -- ; -- if (*p2 == '\0') { -- v = (Awkfloat) (p1 - s1 + 1); /* origin 1 */ -- break; -- } -- } -- tempfree(x); -- tempfree(y); -- setfval(z, v); -- return(z); --} -- --#define MAXNUMSIZE 50 -- --int format(char **pbuf, int *pbufsize, const char *s, Node *a) /* printf-like conversions */ --{ -- char *fmt; -- char *p, *t; -- const char *os; -- Cell *x; -- int flag = 0, n; -- int fmtwd; /* format width */ -- int fmtsz = recsize; -- char *buf = *pbuf; -- int bufsize = *pbufsize; -- -- os = s; -- p = buf; -- if ((fmt = (char *) malloc(fmtsz)) == NULL) -- FATAL("out of memory in format()"); -- while (*s) { -- adjbuf(&buf, &bufsize, MAXNUMSIZE+1+p-buf, recsize, &p, "format"); -- if (*s != '%') { -- *p++ = *s++; -- continue; -- } -- if (*(s+1) == '%') { -- *p++ = '%'; -- s += 2; -- continue; -- } -- /* have to be real careful in case this is a huge number, eg, %100000d */ -- fmtwd = atoi(s+1); -- if (fmtwd < 0) -- fmtwd = -fmtwd; -- adjbuf(&buf, &bufsize, fmtwd+1+p-buf, recsize, &p, "format"); -- for (t = fmt; (*t++ = *s) != '\0'; s++) { -- if (!adjbuf(&fmt, &fmtsz, MAXNUMSIZE+1+t-fmt, recsize, &t, 0)) -- FATAL("format item %.30s... ran format() out of memory", os); -- if (isalpha((uschar)*s) && *s != 'l' && *s != 'h' && *s != 'L') -- break; /* the ansi panoply */ -- if (*s == '*') { -- x = execute(a); -- a = a->nnext; -- sprintf(t-1, "%d", fmtwd=(int) getfval(x)); -- if (fmtwd < 0) -- fmtwd = -fmtwd; -- adjbuf(&buf, &bufsize, fmtwd+1+p-buf, recsize, &p, "format"); -- t = fmt + strlen(fmt); -- tempfree(x); -- } -- } -- *t = '\0'; -- if (fmtwd < 0) -- fmtwd = -fmtwd; -- adjbuf(&buf, &bufsize, fmtwd+1+p-buf, recsize, &p, "format"); -- -- switch (*s) { -- case 'f': case 'e': case 'g': case 'E': case 'G': -- flag = 'f'; -- break; -- case 'd': case 'i': -- flag = 'd'; -- if(*(s-1) == 'l') break; -- *(t-1) = 'l'; -- *t = 'd'; -- *++t = '\0'; -- break; -- case 'o': case 'x': case 'X': case 'u': -- flag = *(s-1) == 'l' ? 'd' : 'u'; -- break; -- case 's': -- flag = 's'; -- break; -- case 'c': -- flag = 'c'; -- break; -- default: -- WARNING("weird printf conversion %s", fmt); -- flag = '?'; -- break; -- } -- if (a == NULL) -- FATAL("not enough args in printf(%s)", os); -- x = execute(a); -- a = a->nnext; -- n = MAXNUMSIZE; -- if (fmtwd > n) -- n = fmtwd; -- adjbuf(&buf, &bufsize, 1+n+p-buf, recsize, &p, "format"); -- switch (flag) { -- case '?': sprintf(p, "%s", fmt); /* unknown, so dump it too */ -- t = getsval(x); -- n = strlen(t); -- if (fmtwd > n) -- n = fmtwd; -- adjbuf(&buf, &bufsize, 1+strlen(p)+n+p-buf, recsize, &p, "format"); -- p += strlen(p); -- sprintf(p, "%s", t); -- break; -- case 'f': sprintf(p, fmt, getfval(x)); break; -- case 'd': sprintf(p, fmt, (long) getfval(x)); break; -- case 'u': sprintf(p, fmt, (int) getfval(x)); break; -- case 's': -- t = getsval(x); -- n = strlen(t); -- if (fmtwd > n) -- n = fmtwd; -- if (!adjbuf(&buf, &bufsize, 1+n+p-buf, recsize, &p, 0)) -- FATAL("huge string/format (%d chars) in printf %.30s... ran format() out of memory", n, t); -- sprintf(p, fmt, t); -- break; -- case 'c': -- if (isnum(x)) { -- if (getfval(x)) -- sprintf(p, fmt, (int) getfval(x)); -- else { -- *p++ = '\0'; /* explicit null byte */ -- *p = '\0'; /* next output will start here */ -- } -- } else -- sprintf(p, fmt, getsval(x)[0]); -- break; -- default: -- FATAL("can't happen: bad conversion %c in format()", flag); -- } -- tempfree(x); -- p += strlen(p); -- s++; -- } -- *p = '\0'; -- free(fmt); -- for ( ; a; a = a->nnext) /* evaluate any remaining args */ -- execute(a); -- *pbuf = buf; -- *pbufsize = bufsize; -- return p - buf; --} -- --Cell *awksprintf(Node **a, int n) /* sprintf(a[0]) */ --{ -- Cell *x; -- Node *y; -- char *buf; -- int bufsz=3*recsize; -- -- if ((buf = (char *) malloc(bufsz)) == NULL) -- FATAL("out of memory in awksprintf"); -- y = a[0]->nnext; -- x = execute(a[0]); -- if (format(&buf, &bufsz, getsval(x), y) == -1) -- FATAL("sprintf string %.30s... too long. can't happen.", buf); -- tempfree(x); -- x = gettemp(); -- x->sval = buf; -- x->tval = STR; -- return(x); --} -- --Cell *awkprintf(Node **a, int n) /* printf */ --{ /* a[0] is list of args, starting with format string */ -- /* a[1] is redirection operator, a[2] is redirection file */ -- FILE *fp; -- Cell *x; -- Node *y; -- char *buf; -- int len; -- int bufsz=3*recsize; -- -- if ((buf = (char *) malloc(bufsz)) == NULL) -- FATAL("out of memory in awkprintf"); -- y = a[0]->nnext; -- x = execute(a[0]); -- if ((len = format(&buf, &bufsz, getsval(x), y)) == -1) -- FATAL("printf string %.30s... too long. can't happen.", buf); -- tempfree(x); -- if (a[1] == NULL) { -- /* fputs(buf, stdout); */ -- fwrite(buf, len, 1, stdout); -- if (ferror(stdout)) -- FATAL("write error on stdout"); -- } else { -- fp = redirect(ptoi(a[1]), a[2]); -- /* fputs(buf, fp); */ -- fwrite(buf, len, 1, fp); -- fflush(fp); -- if (ferror(fp)) -- FATAL("write error on %s", filename(fp)); -- } -- free(buf); -- return(True); --} -- --Cell *arith(Node **a, int n) /* a[0] + a[1], etc. also -a[0] */ --{ -- Awkfloat i, j = 0; -- double v; -- Cell *x, *y, *z; -- -- x = execute(a[0]); -- i = getfval(x); -- tempfree(x); -- if (n != UMINUS) { -- y = execute(a[1]); -- j = getfval(y); -- tempfree(y); -- } -- z = gettemp(); -- switch (n) { -- case ADD: -- i += j; -- break; -- case MINUS: -- i -= j; -- break; -- case MULT: -- i *= j; -- break; -- case DIVIDE: -- if (j == 0) -- FATAL("division by zero"); -- i /= j; -- break; -- case MOD: -- if (j == 0) -- FATAL("division by zero in mod"); -- modf(i/j, &v); -- i = i - j * v; -- break; -- case UMINUS: -- i = -i; -- break; -- case POWER: -- if (j >= 0 && modf(j, &v) == 0.0) /* pos integer exponent */ -- i = ipow(i, (int) j); -- else -- i = errcheck(pow(i, j), "pow"); -- break; -- default: /* can't happen */ -- FATAL("illegal arithmetic operator %d", n); -- } -- setfval(z, i); -- return(z); --} -- --double ipow(double x, int n) /* x**n. ought to be done by pow, but isn't always */ --{ -- double v; -- -- if (n <= 0) -- return 1; -- v = ipow(x, n/2); -- if (n % 2 == 0) -- return v * v; -- else -- return x * v * v; --} -- --Cell *incrdecr(Node **a, int n) /* a[0]++, etc. */ --{ -- Cell *x, *z; -- int k; -- Awkfloat xf; -- -- x = execute(a[0]); -- xf = getfval(x); -- k = (n == PREINCR || n == POSTINCR) ? 1 : -1; -- if (n == PREINCR || n == PREDECR) { -- setfval(x, xf + k); -- return(x); -- } -- z = gettemp(); -- setfval(z, xf); -- setfval(x, xf + k); -- tempfree(x); -- return(z); --} -- --Cell *assign(Node **a, int n) /* a[0] = a[1], a[0] += a[1], etc. */ --{ /* this is subtle; don't muck with it. */ -- Cell *x, *y; -- Awkfloat xf, yf; -- double v; -- -- y = execute(a[1]); -- x = execute(a[0]); -- if (n == ASSIGN) { /* ordinary assignment */ -- if (x == y && !(x->tval & (FLD|REC))) /* self-assignment: */ -- ; /* leave alone unless it's a field */ -- else if ((y->tval & (STR|NUM)) == (STR|NUM)) { -- setsval(x, getsval(y)); -- x->fval = getfval(y); -- x->tval |= NUM; -- } -- else if (isstr(y)) -- setsval(x, getsval(y)); -- else if (isnum(y)) -- setfval(x, getfval(y)); -- else -- funnyvar(y, "read value of"); -- tempfree(y); -- return(x); -- } -- xf = getfval(x); -- yf = getfval(y); -- switch (n) { -- case ADDEQ: -- xf += yf; -- break; -- case SUBEQ: -- xf -= yf; -- break; -- case MULTEQ: -- xf *= yf; -- break; -- case DIVEQ: -- if (yf == 0) -- FATAL("division by zero in /="); -- xf /= yf; -- break; -- case MODEQ: -- if (yf == 0) -- FATAL("division by zero in %%="); -- modf(xf/yf, &v); -- xf = xf - yf * v; -- break; -- case POWEQ: -- if (yf >= 0 && modf(yf, &v) == 0.0) /* pos integer exponent */ -- xf = ipow(xf, (int) yf); -- else -- xf = errcheck(pow(xf, yf), "pow"); -- break; -- default: -- FATAL("illegal assignment operator %d", n); -- break; -- } -- tempfree(y); -- setfval(x, xf); -- return(x); --} -- --Cell *cat(Node **a, int q) /* a[0] cat a[1] */ --{ -- Cell *x, *y, *z; -- int n1, n2; -- char *s; -- -- x = execute(a[0]); -- y = execute(a[1]); -- getsval(x); -- getsval(y); -- n1 = strlen(x->sval); -- n2 = strlen(y->sval); -- s = (char *) malloc(n1 + n2 + 1); -- if (s == NULL) -- FATAL("out of space concatenating %.15s... and %.15s...", -- x->sval, y->sval); -- strcpy(s, x->sval); -- strcpy(s+n1, y->sval); -- tempfree(y); -- z = gettemp(); -- z->sval = s; -- z->tval = STR; -- tempfree(x); -- return(z); --} -- --Cell *pastat(Node **a, int n) /* a[0] { a[1] } */ --{ -- Cell *x; -- -- if (a[0] == 0) -- x = execute(a[1]); -- else { -- x = execute(a[0]); -- if (istrue(x)) { -- tempfree(x); -- x = execute(a[1]); -- } -- } -- return x; --} -- --Cell *dopa2(Node **a, int n) /* a[0], a[1] { a[2] } */ --{ -- Cell *x; -- int pair; -- -- pair = ptoi(a[3]); -- if (pairstack[pair] == 0) { -- x = execute(a[0]); -- if (istrue(x)) -- pairstack[pair] = 1; -- tempfree(x); -- } -- if (pairstack[pair] == 1) { -- x = execute(a[1]); -- if (istrue(x)) -- pairstack[pair] = 0; -- tempfree(x); -- x = execute(a[2]); -- return(x); -- } -- return(False); --} -- --Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */ --{ -- Cell *x = 0, *y, *ap; -- char *s; -- int sep; -- char *t, temp, num[50], *fs = 0; -- int n, tempstat, arg3type; -- -- y = execute(a[0]); /* source string */ -- s = getsval(y); -- arg3type = ptoi(a[3]); -- if (a[2] == 0) /* fs string */ -- fs = *FS; -- else if (arg3type == STRING) { /* split(str,arr,"string") */ -- x = execute(a[2]); -- fs = getsval(x); -- } else if (arg3type == REGEXPR) -- fs = "(regexpr)"; /* split(str,arr,/regexpr/) */ -- else -- FATAL("illegal type of split"); -- sep = *fs; -- ap = execute(a[1]); /* array name */ -- freesymtab(ap); -- dprintf( ("split: s=|%s|, a=%s, sep=|%s|\n", s, NN(ap->nval), fs) ); -- ap->tval &= ~STR; -- ap->tval |= ARR; -- ap->sval = (char *) makesymtab(NSYMTAB); -- -- n = 0; -- if (*s != '\0' && (strlen(fs) > 1 || arg3type == REGEXPR)) { /* reg expr */ -- fa *pfa; -- if (arg3type == REGEXPR) { /* it's ready already */ -- pfa = (fa *) a[2]; -- } else { -- pfa = makedfa(fs, 1); -- } -- if (nematch(pfa,s)) { -- tempstat = pfa->initstat; -- pfa->initstat = 2; -- do { -- n++; -- sprintf(num, "%d", n); -- temp = *patbeg; -- *patbeg = '\0'; -- if (is_number(s)) -- setsymtab(num, s, atof(s), STR|NUM, (Array *) ap->sval); -- else -- setsymtab(num, s, 0.0, STR, (Array *) ap->sval); -- *patbeg = temp; -- s = patbeg + patlen; -- if (*(patbeg+patlen-1) == 0 || *s == 0) { -- n++; -- sprintf(num, "%d", n); -- setsymtab(num, "", 0.0, STR, (Array *) ap->sval); -- pfa->initstat = tempstat; -- goto spdone; -- } -- } while (nematch(pfa,s)); -- pfa->initstat = tempstat; /* bwk: has to be here to reset */ -- /* cf gsub and refldbld */ -- } -- n++; -- sprintf(num, "%d", n); -- if (is_number(s)) -- setsymtab(num, s, atof(s), STR|NUM, (Array *) ap->sval); -- else -- setsymtab(num, s, 0.0, STR, (Array *) ap->sval); -- spdone: -- pfa = NULL; -- } else if (sep == ' ') { -- for (n = 0; ; ) { -- while (*s == ' ' || *s == '\t' || *s == '\n') -- s++; -- if (*s == 0) -- break; -- n++; -- t = s; -- do -- s++; -- while (*s!=' ' && *s!='\t' && *s!='\n' && *s!='\0'); -- temp = *s; -- *s = '\0'; -- sprintf(num, "%d", n); -- if (is_number(t)) -- setsymtab(num, t, atof(t), STR|NUM, (Array *) ap->sval); -- else -- setsymtab(num, t, 0.0, STR, (Array *) ap->sval); -- *s = temp; -- if (*s != 0) -- s++; -- } -- } else if (sep == 0) { /* new: split(s, a, "") => 1 char/elem */ -- for (n = 0; *s != 0; s++) { -- char buf[2]; -- n++; -- sprintf(num, "%d", n); -- buf[0] = *s; -- buf[1] = 0; -- if (isdigit((uschar)buf[0])) -- setsymtab(num, buf, atof(buf), STR|NUM, (Array *) ap->sval); -- else -- setsymtab(num, buf, 0.0, STR, (Array *) ap->sval); -- } -- } else if (*s != 0) { -- for (;;) { -- n++; -- t = s; -- while (*s != sep && *s != '\n' && *s != '\0') -- s++; -- temp = *s; -- *s = '\0'; -- sprintf(num, "%d", n); -- if (is_number(t)) -- setsymtab(num, t, atof(t), STR|NUM, (Array *) ap->sval); -- else -- setsymtab(num, t, 0.0, STR, (Array *) ap->sval); -- *s = temp; -- if (*s++ == 0) -- break; -- } -- } -- tempfree(ap); -- tempfree(y); -- if (a[2] != 0 && arg3type == STRING) { -- tempfree(x); -- } -- x = gettemp(); -- x->tval = NUM; -- x->fval = n; -- return(x); --} -- --Cell *condexpr(Node **a, int n) /* a[0] ? a[1] : a[2] */ --{ -- Cell *x; -- -- x = execute(a[0]); -- if (istrue(x)) { -- tempfree(x); -- x = execute(a[1]); -- } else { -- tempfree(x); -- x = execute(a[2]); -- } -- return(x); --} -- --Cell *ifstat(Node **a, int n) /* if (a[0]) a[1]; else a[2] */ --{ -- Cell *x; -- -- x = execute(a[0]); -- if (istrue(x)) { -- tempfree(x); -- x = execute(a[1]); -- } else if (a[2] != 0) { -- tempfree(x); -- x = execute(a[2]); -- } -- return(x); --} -- --Cell *whilestat(Node **a, int n) /* while (a[0]) a[1] */ --{ -- Cell *x; -- -- for (;;) { -- x = execute(a[0]); -- if (!istrue(x)) -- return(x); -- tempfree(x); -- x = execute(a[1]); -- if (isbreak(x)) { -- x = True; -- return(x); -- } -- if (isnext(x) || isexit(x) || isret(x)) -- return(x); -- tempfree(x); -- } --} -- --Cell *dostat(Node **a, int n) /* do a[0]; while(a[1]) */ --{ -- Cell *x; -- -- for (;;) { -- x = execute(a[0]); -- if (isbreak(x)) -- return True; -- if (isnext(x) || isexit(x) || isret(x)) -- return(x); -- tempfree(x); -- x = execute(a[1]); -- if (!istrue(x)) -- return(x); -- tempfree(x); -- } --} -- --Cell *forstat(Node **a, int n) /* for (a[0]; a[1]; a[2]) a[3] */ --{ -- Cell *x; -- -- x = execute(a[0]); -- tempfree(x); -- for (;;) { -- if (a[1]!=0) { -- x = execute(a[1]); -- if (!istrue(x)) return(x); -- else tempfree(x); -- } -- x = execute(a[3]); -- if (isbreak(x)) /* turn off break */ -- return True; -- if (isnext(x) || isexit(x) || isret(x)) -- return(x); -- tempfree(x); -- x = execute(a[2]); -- tempfree(x); -- } --} -- --Cell *instat(Node **a, int n) /* for (a[0] in a[1]) a[2] */ --{ -- Cell *x, *vp, *arrayp, *cp, *ncp; -- Array *tp; -- int i; -- -- vp = execute(a[0]); -- arrayp = execute(a[1]); -- if (!isarr(arrayp)) { -- return True; -- } -- tp = (Array *) arrayp->sval; -- tempfree(arrayp); -- for (i = 0; i < tp->size; i++) { /* this routine knows too much */ -- for (cp = tp->tab[i]; cp != NULL; cp = ncp) { -- setsval(vp, cp->nval); -- ncp = cp->cnext; -- x = execute(a[2]); -- if (isbreak(x)) { -- tempfree(vp); -- return True; -- } -- if (isnext(x) || isexit(x) || isret(x)) { -- tempfree(vp); -- return(x); -- } -- tempfree(x); -- } -- } -- return True; --} -- --Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg list */ --{ -- Cell *x, *y; -- Awkfloat u; -- int t; -- char *p, *buf; -- Node *nextarg; -- FILE *fp; -- void flush_all(void); -- -- t = ptoi(a[0]); -- x = execute(a[1]); -- nextarg = a[1]->nnext; -- switch (t) { -- case FLENGTH: -- if (isarr(x)) -- u = ((Array *) x->sval)->nelem; /* GROT. should be function*/ -- else -- u = strlen(getsval(x)); -- break; -- case FLOG: -- u = errcheck(log(getfval(x)), "log"); break; -- case FINT: -- modf(getfval(x), &u); break; -- case FEXP: -- u = errcheck(exp(getfval(x)), "exp"); break; -- case FSQRT: -- u = errcheck(sqrt(getfval(x)), "sqrt"); break; -- case FSIN: -- u = sin(getfval(x)); break; -- case FCOS: -- u = cos(getfval(x)); break; -- case FATAN: -- if (nextarg == 0) { -- WARNING("atan2 requires two arguments; returning 1.0"); -- u = 1.0; -- } else { -- y = execute(a[1]->nnext); -- u = atan2(getfval(x), getfval(y)); -- tempfree(y); -- nextarg = nextarg->nnext; -- } -- break; -- case FSYSTEM: -- fflush(stdout); /* in case something is buffered already */ -- u = (Awkfloat) system(getsval(x)) / 256; /* 256 is unix-dep */ -- break; -- case FRAND: -- /* in principle, rand() returns something in 0..RAND_MAX */ -- u = (Awkfloat) (rand() % RAND_MAX) / RAND_MAX; -- break; -- case FSRAND: -- if (isrec(x)) /* no argument provided */ -- u = time((time_t *)0); -- else -- u = getfval(x); -- srand((unsigned int) u); -- break; -- case FTOUPPER: -- case FTOLOWER: -- buf = tostring(getsval(x)); -- if (t == FTOUPPER) { -- for (p = buf; *p; p++) -- if (islower((uschar) *p)) -- *p = toupper((uschar)*p); -- } else { -- for (p = buf; *p; p++) -- if (isupper((uschar) *p)) -- *p = tolower((uschar)*p); -- } -- tempfree(x); -- x = gettemp(); -- setsval(x, buf); -- free(buf); -- return x; -- case FFLUSH: -- if (isrec(x) || strlen(getsval(x)) == 0) { -- flush_all(); /* fflush() or fflush("") -> all */ -- u = 0; -- } else if ((fp = openfile(FFLUSH, getsval(x))) == NULL) -- u = EOF; -- else -- u = fflush(fp); -- break; -- default: /* can't happen */ -- FATAL("illegal function type %d", t); -- break; -- } -- tempfree(x); -- x = gettemp(); -- setfval(x, u); -- if (nextarg != 0) { -- WARNING("warning: function has too many arguments"); -- for ( ; nextarg; nextarg = nextarg->nnext) -- execute(nextarg); -- } -- return(x); --} -- --Cell *printstat(Node **a, int n) /* print a[0] */ --{ -- Node *x; -- Cell *y; -- FILE *fp; -- -- if (a[1] == 0) /* a[1] is redirection operator, a[2] is file */ -- fp = stdout; -- else -- fp = redirect(ptoi(a[1]), a[2]); -- for (x = a[0]; x != NULL; x = x->nnext) { -- y = execute(x); -- fputs(getpssval(y), fp); -- tempfree(y); -- if (x->nnext == NULL) -- fputs(*ORS, fp); -- else -- fputs(*OFS, fp); -- } -- if (a[1] != 0) -- fflush(fp); -- if (ferror(fp)) -- FATAL("write error on %s", filename(fp)); -- return(True); --} -- --Cell *nullproc(Node **a, int n) --{ -- n = n; -- a = a; -- return 0; --} -- -- --FILE *redirect(int a, Node *b) /* set up all i/o redirections */ --{ -- FILE *fp; -- Cell *x; -- char *fname; -- -- x = execute(b); -- fname = getsval(x); -- fp = openfile(a, fname); -- if (fp == NULL) -- FATAL("can't open file %s", fname); -- tempfree(x); -- return fp; --} -- --struct files { -- FILE *fp; -- const char *fname; -- int mode; /* '|', 'a', 'w' => LE/LT, GT */ --} files[FOPEN_MAX] ={ -- { NULL, "/dev/stdin", LT }, /* watch out: don't free this! */ -- { NULL, "/dev/stdout", GT }, -- { NULL, "/dev/stderr", GT } --}; -- --void stdinit(void) /* in case stdin, etc., are not constants */ --{ -- files[0].fp = stdin; -- files[1].fp = stdout; -- files[2].fp = stderr; --} -- --FILE *openfile(int a, const char *us) --{ -- const char *s = us; -- int i, m; -- FILE *fp = 0; -- -- if (*s == '\0') -- FATAL("null file name in print or getline"); -- for (i=0; i < FOPEN_MAX; i++) -- if (files[i].fname && strcmp(s, files[i].fname) == 0) { -- if (a == files[i].mode || (a==APPEND && files[i].mode==GT)) -- return files[i].fp; -- if (a == FFLUSH) -- return files[i].fp; -- } -- if (a == FFLUSH) /* didn't find it, so don't create it! */ -- return NULL; -- -- for (i=0; i < FOPEN_MAX; i++) -- if (files[i].fp == 0) -- break; -- if (i >= FOPEN_MAX) -- FATAL("%s makes too many open files", s); -- fflush(stdout); /* force a semblance of order */ -- m = a; -- if (a == GT) { -- fp = fopen(s, "w"); -- } else if (a == APPEND) { -- fp = fopen(s, "a"); -- m = GT; /* so can mix > and >> */ -- } else if (a == '|') { /* output pipe */ -- fp = popen(s, "w"); -- } else if (a == LE) { /* input pipe */ -- fp = popen(s, "r"); -- } else if (a == LT) { /* getline <file */ -- fp = strcmp(s, "-") == 0 ? stdin : fopen(s, "r"); /* "-" is stdin */ -- } else /* can't happen */ -- FATAL("illegal redirection %d", a); -- if (fp != NULL) { -- files[i].fname = tostring(s); -- files[i].fp = fp; -- files[i].mode = m; -- } -- return fp; --} -- --const char *filename(FILE *fp) --{ -- int i; -- -- for (i = 0; i < FOPEN_MAX; i++) -- if (fp == files[i].fp) -- return files[i].fname; -- return "???"; --} -- --Cell *closefile(Node **a, int n) --{ -- Cell *x; -- int i, stat; -- -- n = n; -- x = execute(a[0]); -- getsval(x); -- stat = -1; -- for (i = 0; i < FOPEN_MAX; i++) { -- if (files[i].fname && strcmp(x->sval, files[i].fname) == 0) { -- if (ferror(files[i].fp)) -- WARNING( "i/o error occurred on %s", files[i].fname ); -- if (files[i].mode == '|' || files[i].mode == LE) -- stat = pclose(files[i].fp); -- else -- stat = fclose(files[i].fp); -- if (stat == EOF) -- WARNING( "i/o error occurred closing %s", files[i].fname ); -- if (i > 2) /* don't do /dev/std... */ -- xfree(files[i].fname); -- files[i].fname = NULL; /* watch out for ref thru this */ -- files[i].fp = NULL; -- } -- } -- tempfree(x); -- x = gettemp(); -- setfval(x, (Awkfloat) stat); -- return(x); --} -- --void closeall(void) --{ -- int i, stat; -- -- for (i = 0; i < FOPEN_MAX; i++) { -- if (files[i].fp) { -- if (ferror(files[i].fp)) -- WARNING( "i/o error occurred on %s", files[i].fname ); -- if (files[i].mode == '|' || files[i].mode == LE) -- stat = pclose(files[i].fp); -- else -- stat = fclose(files[i].fp); -- if (stat == EOF) -- WARNING( "i/o error occurred while closing %s", files[i].fname ); -- } -- } --} -- --void flush_all(void) --{ -- int i; -- -- for (i = 0; i < FOPEN_MAX; i++) -- if (files[i].fp) -- fflush(files[i].fp); --} -- --void backsub(char **pb_ptr, char **sptr_ptr); -- --Cell *sub(Node **a, int nnn) /* substitute command */ --{ -- char *sptr, *pb, *q; -- Cell *x, *y, *result; -- char *t, *buf; -- fa *pfa; -- int bufsz = recsize; -- -- if ((buf = (char *) malloc(bufsz)) == NULL) -- FATAL("out of memory in sub"); -- x = execute(a[3]); /* target string */ -- t = getsval(x); -- if (a[0] == 0) /* 0 => a[1] is already-compiled regexpr */ -- pfa = (fa *) a[1]; /* regular expression */ -- else { -- y = execute(a[1]); -- pfa = makedfa(getsval(y), 1); -- tempfree(y); -- } -- y = execute(a[2]); /* replacement string */ -- result = False; -- if (pmatch(pfa, t)) { -- sptr = t; -- adjbuf(&buf, &bufsz, 1+patbeg-sptr, recsize, 0, "sub"); -- pb = buf; -- while (sptr < patbeg) -- *pb++ = *sptr++; -- sptr = getsval(y); -- while (*sptr != 0) { -- adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "sub"); -- if (*sptr == '\\') { -- backsub(&pb, &sptr); -- } else if (*sptr == '&') { -- sptr++; -- adjbuf(&buf, &bufsz, 1+patlen+pb-buf, recsize, &pb, "sub"); -- for (q = patbeg; q < patbeg+patlen; ) -- *pb++ = *q++; -- } else -- *pb++ = *sptr++; -- } -- *pb = '\0'; -- if (pb > buf + bufsz) -- FATAL("sub result1 %.30s too big; can't happen", buf); -- sptr = patbeg + patlen; -- if ((patlen == 0 && *patbeg) || (patlen && *(sptr-1))) { -- adjbuf(&buf, &bufsz, 1+strlen(sptr)+pb-buf, 0, &pb, "sub"); -- while ((*pb++ = *sptr++) != 0) -- ; -- } -- if (pb > buf + bufsz) -- FATAL("sub result2 %.30s too big; can't happen", buf); -- setsval(x, buf); /* BUG: should be able to avoid copy */ -- result = True;; -- } -- tempfree(x); -- tempfree(y); -- free(buf); -- return result; --} -- --Cell *gsub(Node **a, int nnn) /* global substitute */ --{ -- Cell *x, *y; -- char *rptr, *sptr, *t, *pb, *q; -- char *buf; -- fa *pfa; -- int mflag, tempstat, num; -- int bufsz = recsize; -- -- if ((buf = (char *) malloc(bufsz)) == NULL) -- FATAL("out of memory in gsub"); -- mflag = 0; /* if mflag == 0, can replace empty string */ -- num = 0; -- x = execute(a[3]); /* target string */ -- t = getsval(x); -- if (a[0] == 0) /* 0 => a[1] is already-compiled regexpr */ -- pfa = (fa *) a[1]; /* regular expression */ -- else { -- y = execute(a[1]); -- pfa = makedfa(getsval(y), 1); -- tempfree(y); -- } -- y = execute(a[2]); /* replacement string */ -- if (pmatch(pfa, t)) { -- tempstat = pfa->initstat; -- pfa->initstat = 2; -- pb = buf; -- rptr = getsval(y); -- do { -- if (patlen == 0 && *patbeg != 0) { /* matched empty string */ -- if (mflag == 0) { /* can replace empty */ -- num++; -- sptr = rptr; -- while (*sptr != 0) { -- adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "gsub"); -- if (*sptr == '\\') { -- backsub(&pb, &sptr); -- } else if (*sptr == '&') { -- sptr++; -- adjbuf(&buf, &bufsz, 1+patlen+pb-buf, recsize, &pb, "gsub"); -- for (q = patbeg; q < patbeg+patlen; ) -- *pb++ = *q++; -- } else -- *pb++ = *sptr++; -- } -- } -- if (*t == 0) /* at end */ -- goto done; -- adjbuf(&buf, &bufsz, 2+pb-buf, recsize, &pb, "gsub"); -- *pb++ = *t++; -- if (pb > buf + bufsz) /* BUG: not sure of this test */ -- FATAL("gsub result0 %.30s too big; can't happen", buf); -- mflag = 0; -- } -- else { /* matched nonempty string */ -- num++; -- sptr = t; -- adjbuf(&buf, &bufsz, 1+(patbeg-sptr)+pb-buf, recsize, &pb, "gsub"); -- while (sptr < patbeg) -- *pb++ = *sptr++; -- sptr = rptr; -- while (*sptr != 0) { -- adjbuf(&buf, &bufsz, 5+pb-buf, recsize, &pb, "gsub"); -- if (*sptr == '\\') { -- backsub(&pb, &sptr); -- } else if (*sptr == '&') { -- sptr++; -- adjbuf(&buf, &bufsz, 1+patlen+pb-buf, recsize, &pb, "gsub"); -- for (q = patbeg; q < patbeg+patlen; ) -- *pb++ = *q++; -- } else -- *pb++ = *sptr++; -- } -- t = patbeg + patlen; -- if (patlen == 0 || *t == 0 || *(t-1) == 0) -- goto done; -- if (pb > buf + bufsz) -- FATAL("gsub result1 %.30s too big; can't happen", buf); -- mflag = 1; -- } -- } while (pmatch(pfa,t)); -- sptr = t; -- adjbuf(&buf, &bufsz, 1+strlen(sptr)+pb-buf, 0, &pb, "gsub"); -- while ((*pb++ = *sptr++) != 0) -- ; -- done: if (pb > buf + bufsz) -- FATAL("gsub result2 %.30s too big; can't happen", buf); -- *pb = '\0'; -- setsval(x, buf); /* BUG: should be able to avoid copy + free */ -- pfa->initstat = tempstat; -- } -- tempfree(x); -- tempfree(y); -- x = gettemp(); -- x->tval = NUM; -- x->fval = num; -- free(buf); -- return(x); --} -- --void backsub(char **pb_ptr, char **sptr_ptr) /* handle \\& variations */ --{ /* sptr[0] == '\\' */ -- char *pb = *pb_ptr, *sptr = *sptr_ptr; -- -- if (sptr[1] == '\\') { -- if (sptr[2] == '\\' && sptr[3] == '&') { /* \\\& -> \& */ -- *pb++ = '\\'; -- *pb++ = '&'; -- sptr += 4; -- } else if (sptr[2] == '&') { /* \\& -> \ + matched */ -- *pb++ = '\\'; -- sptr += 2; -- } else { /* \\x -> \\x */ -- *pb++ = *sptr++; -- *pb++ = *sptr++; -- } -- } else if (sptr[1] == '&') { /* literal & */ -- sptr++; -- *pb++ = *sptr++; -- } else /* literal \ */ -- *pb++ = *sptr++; -- -- *pb_ptr = pb; -- *sptr_ptr = sptr; --} -//GO.SYSIN DD run.c -echo tran.c 1>&2 -sed 's/.//' >tran.c <<'//GO.SYSIN DD tran.c' --/**************************************************************** --Copyright (C) Lucent Technologies 1997 --All Rights Reserved -- --Permission to use, copy, modify, and distribute this software and --its documentation for any purpose and without fee is hereby --granted, provided that the above copyright notice appear in all --copies and that both that the copyright notice and this --permission notice and warranty disclaimer appear in supporting --documentation, and that the name Lucent Technologies or any of --its entities not be used in advertising or publicity pertaining --to distribution of the software without specific, written prior --permission. -- --LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --THIS SOFTWARE. --****************************************************************/ -- --#define DEBUG --#include <stdio.h> --#include <math.h> --#include <ctype.h> --#include <string.h> --#include <stdlib.h> --#include "awk.h" --#include "ytab.h" -- --#define FULLTAB 2 /* rehash when table gets this x full */ --#define GROWTAB 4 /* grow table by this factor */ -- --Array *symtab; /* main symbol table */ -- --char **FS; /* initial field sep */ --char **RS; /* initial record sep */ --char **OFS; /* output field sep */ --char **ORS; /* output record sep */ --char **OFMT; /* output format for numbers */ --char **CONVFMT; /* format for conversions in getsval */ --Awkfloat *NF; /* number of fields in current record */ --Awkfloat *NR; /* number of current record */ --Awkfloat *FNR; /* number of current record in current file */ --char **FILENAME; /* current filename argument */ --Awkfloat *ARGC; /* number of arguments from command line */ --char **SUBSEP; /* subscript separator for a[i,j,k]; default \034 */ --Awkfloat *RSTART; /* start of re matched with ~; origin 1 (!) */ --Awkfloat *RLENGTH; /* length of same */ -- --Cell *fsloc; /* FS */ --Cell *nrloc; /* NR */ --Cell *nfloc; /* NF */ --Cell *fnrloc; /* FNR */ --Array *ARGVtab; /* symbol table containing ARGV[...] */ --Array *ENVtab; /* symbol table containing ENVIRON[...] */ --Cell *rstartloc; /* RSTART */ --Cell *rlengthloc; /* RLENGTH */ --Cell *symtabloc; /* SYMTAB */ -- --Cell *nullloc; /* a guaranteed empty cell */ --Node *nullnode; /* zero&null, converted into a node for comparisons */ --Cell *literal0; -- --extern Cell **fldtab; -- --void syminit(void) /* initialize symbol table with builtin vars */ --{ -- literal0 = setsymtab("0", "0", 0.0, NUM|STR|CON|DONTFREE, symtab); -- /* this is used for if(x)... tests: */ -- nullloc = setsymtab("$zero&null", "", 0.0, NUM|STR|CON|DONTFREE, symtab); -- nullnode = celltonode(nullloc, CCON); -- -- fsloc = setsymtab("FS", " ", 0.0, STR|DONTFREE, symtab); -- FS = &fsloc->sval; -- RS = &setsymtab("RS", "\n", 0.0, STR|DONTFREE, symtab)->sval; -- OFS = &setsymtab("OFS", " ", 0.0, STR|DONTFREE, symtab)->sval; -- ORS = &setsymtab("ORS", "\n", 0.0, STR|DONTFREE, symtab)->sval; -- OFMT = &setsymtab("OFMT", "%.6g", 0.0, STR|DONTFREE, symtab)->sval; -- CONVFMT = &setsymtab("CONVFMT", "%.6g", 0.0, STR|DONTFREE, symtab)->sval; -- FILENAME = &setsymtab("FILENAME", "", 0.0, STR|DONTFREE, symtab)->sval; -- nfloc = setsymtab("NF", "", 0.0, NUM, symtab); -- NF = &nfloc->fval; -- nrloc = setsymtab("NR", "", 0.0, NUM, symtab); -- NR = &nrloc->fval; -- fnrloc = setsymtab("FNR", "", 0.0, NUM, symtab); -- FNR = &fnrloc->fval; -- SUBSEP = &setsymtab("SUBSEP", "\034", 0.0, STR|DONTFREE, symtab)->sval; -- rstartloc = setsymtab("RSTART", "", 0.0, NUM, symtab); -- RSTART = &rstartloc->fval; -- rlengthloc = setsymtab("RLENGTH", "", 0.0, NUM, symtab); -- RLENGTH = &rlengthloc->fval; -- symtabloc = setsymtab("SYMTAB", "", 0.0, ARR, symtab); -- symtabloc->sval = (char *) symtab; --} -- --void arginit(int ac, char **av) /* set up ARGV and ARGC */ --{ -- Cell *cp; -- int i; -- char temp[50]; -- -- ARGC = &setsymtab("ARGC", "", (Awkfloat) ac, NUM, symtab)->fval; -- cp = setsymtab("ARGV", "", 0.0, ARR, symtab); -- ARGVtab = makesymtab(NSYMTAB); /* could be (int) ARGC as well */ -- cp->sval = (char *) ARGVtab; -- for (i = 0; i < ac; i++) { -- sprintf(temp, "%d", i); -- if (is_number(*av)) -- setsymtab(temp, *av, atof(*av), STR|NUM, ARGVtab); -- else -- setsymtab(temp, *av, 0.0, STR, ARGVtab); -- av++; -- } --} -- --void envinit(char **envp) /* set up ENVIRON variable */ --{ -- Cell *cp; -- char *p; -- -- cp = setsymtab("ENVIRON", "", 0.0, ARR, symtab); -- ENVtab = makesymtab(NSYMTAB); -- cp->sval = (char *) ENVtab; -- for ( ; *envp; envp++) { -- if ((p = strchr(*envp, '=')) == NULL) -- continue; -- if( p == *envp ) /* no left hand side name in env string */ -- continue; -- *p++ = 0; /* split into two strings at = */ -- if (is_number(p)) -- setsymtab(*envp, p, atof(p), STR|NUM, ENVtab); -- else -- setsymtab(*envp, p, 0.0, STR, ENVtab); -- p[-1] = '='; /* restore in case env is passed down to a shell */ -- } --} -- --Array *makesymtab(int n) /* make a new symbol table */ --{ -- Array *ap; -- Cell **tp; -- -- ap = (Array *) malloc(sizeof(Array)); -- tp = (Cell **) calloc(n, sizeof(Cell *)); -- if (ap == NULL || tp == NULL) -- FATAL("out of space in makesymtab"); -- ap->nelem = 0; -- ap->size = n; -- ap->tab = tp; -- return(ap); --} -- --void freesymtab(Cell *ap) /* free a symbol table */ --{ -- Cell *cp, *temp; -- Array *tp; -- int i; -- -- if (!isarr(ap)) -- return; -- tp = (Array *) ap->sval; -- if (tp == NULL) -- return; -- for (i = 0; i < tp->size; i++) { -- for (cp = tp->tab[i]; cp != NULL; cp = temp) { -- xfree(cp->nval); -- if (freeable(cp)) -- xfree(cp->sval); -- temp = cp->cnext; /* avoids freeing then using */ -- free(cp); -- tp->nelem--; -- } -- tp->tab[i] = 0; -- } -- if (tp->nelem != 0) -- WARNING("can't happen: inconsistent element count freeing %s", ap->nval); -- free(tp->tab); -- free(tp); --} -- --void freeelem(Cell *ap, const char *s) /* free elem s from ap (i.e., ap["s"] */ --{ -- Array *tp; -- Cell *p, *prev = NULL; -- int h; -- -- tp = (Array *) ap->sval; -- h = hash(s, tp->size); -- for (p = tp->tab[h]; p != NULL; prev = p, p = p->cnext) -- if (strcmp(s, p->nval) == 0) { -- if (prev == NULL) /* 1st one */ -- tp->tab[h] = p->cnext; -- else /* middle somewhere */ -- prev->cnext = p->cnext; -- if (freeable(p)) -- xfree(p->sval); -- free(p->nval); -- free(p); -- tp->nelem--; -- return; -- } --} -- --Cell *setsymtab(const char *n, const char *s, Awkfloat f, unsigned t, Array *tp) --{ -- int h; -- Cell *p; -- -- if (n != NULL && (p = lookup(n, tp)) != NULL) { -- dprintf( ("setsymtab found %p: n=%s s=\"%s\" f=%g t=%o\n", -- p, NN(p->nval), NN(p->sval), p->fval, p->tval) ); -- return(p); -- } -- p = (Cell *) malloc(sizeof(Cell)); -- if (p == NULL) -- FATAL("out of space for symbol table at %s", n); -- p->nval = tostring(n); -- p->sval = s ? tostring(s) : tostring(""); -- p->fval = f; -- p->tval = t; -- p->csub = CUNK; -- p->ctype = OCELL; -- tp->nelem++; -- if (tp->nelem > FULLTAB * tp->size) -- rehash(tp); -- h = hash(n, tp->size); -- p->cnext = tp->tab[h]; -- tp->tab[h] = p; -- dprintf( ("setsymtab set %p: n=%s s=\"%s\" f=%g t=%o\n", -- p, p->nval, p->sval, p->fval, p->tval) ); -- return(p); --} -- --int hash(const char *s, int n) /* form hash value for string s */ --{ -- unsigned hashval; -- -- for (hashval = 0; *s != '\0'; s++) -- hashval = (*s + 31 * hashval); -- return hashval % n; --} -- --void rehash(Array *tp) /* rehash items in small table into big one */ --{ -- int i, nh, nsz; -- Cell *cp, *op, **np; -- -- nsz = GROWTAB * tp->size; -- np = (Cell **) calloc(nsz, sizeof(Cell *)); -- if (np == NULL) /* can't do it, but can keep running. */ -- return; /* someone else will run out later. */ -- for (i = 0; i < tp->size; i++) { -- for (cp = tp->tab[i]; cp; cp = op) { -- op = cp->cnext; -- nh = hash(cp->nval, nsz); -- cp->cnext = np[nh]; -- np[nh] = cp; -- } -- } -- free(tp->tab); -- tp->tab = np; -- tp->size = nsz; --} -- --Cell *lookup(const char *s, Array *tp) /* look for s in tp */ --{ -- Cell *p; -- int h; -- -- h = hash(s, tp->size); -- for (p = tp->tab[h]; p != NULL; p = p->cnext) -- if (strcmp(s, p->nval) == 0) -- return(p); /* found it */ -- return(NULL); /* not found */ --} -- --Awkfloat setfval(Cell *vp, Awkfloat f) /* set float val of a Cell */ --{ -- int fldno; -- -- if ((vp->tval & (NUM | STR)) == 0) -- funnyvar(vp, "assign to"); -- if (isfld(vp)) { -- donerec = 0; /* mark $0 invalid */ -- fldno = atoi(vp->nval); -- if (fldno > *NF) -- newfld(fldno); -- dprintf( ("setting field %d to %g\n", fldno, f) ); -- } else if (isrec(vp)) { -- donefld = 0; /* mark $1... invalid */ -- donerec = 1; -- } -- if (freeable(vp)) -- xfree(vp->sval); /* free any previous string */ -- vp->tval &= ~STR; /* mark string invalid */ -- vp->tval |= NUM; /* mark number ok */ -- dprintf( ("setfval %p: %s = %g, t=%o\n", vp, NN(vp->nval), f, vp->tval) ); -- return vp->fval = f; --} -- --void funnyvar(Cell *vp, const char *rw) --{ -- if (isarr(vp)) -- FATAL("can't %s %s; it's an array name.", rw, vp->nval); -- if (vp->tval & FCN) -- FATAL("can't %s %s; it's a function.", rw, vp->nval); -- WARNING("funny variable %p: n=%s s=\"%s\" f=%g t=%o", -- vp, vp->nval, vp->sval, vp->fval, vp->tval); --} -- --char *setsval(Cell *vp, const char *s) /* set string val of a Cell */ --{ -- char *t; -- int fldno; -- -- dprintf( ("starting setsval %p: %s = \"%s\", t=%o, r,f=%d,%d\n", -- vp, NN(vp->nval), s, vp->tval, donerec, donefld) ); -- if ((vp->tval & (NUM | STR)) == 0) -- funnyvar(vp, "assign to"); -- if (isfld(vp)) { -- donerec = 0; /* mark $0 invalid */ -- fldno = atoi(vp->nval); -- if (fldno > *NF) -- newfld(fldno); -- dprintf( ("setting field %d to %s (%p)\n", fldno, s, s) ); -- } else if (isrec(vp)) { -- donefld = 0; /* mark $1... invalid */ -- donerec = 1; -- } -- t = tostring(s); /* in case it's self-assign */ -- vp->tval &= ~NUM; -- vp->tval |= STR; -- if (freeable(vp)) -- xfree(vp->sval); -- vp->tval &= ~DONTFREE; -- dprintf( ("setsval %p: %s = \"%s (%p) \", t=%o r,f=%d,%d\n", -- vp, NN(vp->nval), t,t, vp->tval, donerec, donefld) ); -- return(vp->sval = t); --} -- --Awkfloat getfval(Cell *vp) /* get float val of a Cell */ --{ -- if ((vp->tval & (NUM | STR)) == 0) -- funnyvar(vp, "read value of"); -- if (isfld(vp) && donefld == 0) -- fldbld(); -- else if (isrec(vp) && donerec == 0) -- recbld(); -- if (!isnum(vp)) { /* not a number */ -- vp->fval = atof(vp->sval); /* best guess */ -- if (is_number(vp->sval) && !(vp->tval&CON)) -- vp->tval |= NUM; /* make NUM only sparingly */ -- } -- dprintf( ("getfval %p: %s = %g, t=%o\n", vp, NN(vp->nval), vp->fval, vp->tval) ); -- return(vp->fval); --} -- --static char *get_str_val(Cell *vp, char **fmt) /* get string val of a Cell */ --{ -- char s[100]; /* BUG: unchecked */ -- double dtemp; -- -- if ((vp->tval & (NUM | STR)) == 0) -- funnyvar(vp, "read value of"); -- if (isfld(vp) && donefld == 0) -- fldbld(); -- else if (isrec(vp) && donerec == 0) -- recbld(); -- if (isstr(vp) == 0) { -- if (freeable(vp)) -- xfree(vp->sval); -- if (modf(vp->fval, &dtemp) == 0) /* it's integral */ -- sprintf(s, "%.30g", vp->fval); -- else -- sprintf(s, *fmt, vp->fval); -- vp->sval = tostring(s); -- vp->tval &= ~DONTFREE; -- vp->tval |= STR; -- } -- dprintf( ("getsval %p: %s = \"%s (%p)\", t=%o\n", vp, NN(vp->nval), vp->sval, vp->sval, vp->tval) ); -- return(vp->sval); --} -- --char *getsval(Cell *vp) /* get string val of a Cell */ --{ -- return get_str_val(vp, CONVFMT); --} -- --char *getpssval(Cell *vp) /* get string val of a Cell for print */ --{ -- return get_str_val(vp, OFMT); --} -- -- --char *tostring(const char *s) /* make a copy of string s */ --{ -- char *p; -- -- p = (char *) malloc(strlen(s)+1); -- if (p == NULL) -- FATAL("out of space in tostring on %s", s); -- strcpy(p, s); -- return(p); --} -- --char *qstring(const char *is, int delim) /* collect string up to next delim */ --{ -- const char *os = is; -- int c, n; -- uschar *s = (uschar *) is; -- uschar *buf, *bp; -- -- if ((buf = (uschar *) malloc(strlen(is)+3)) == NULL) -- FATAL( "out of space in qstring(%s)", s); -- for (bp = buf; (c = *s) != delim; s++) { -- if (c == '\n') -- SYNTAX( "newline in string %.20s...", os ); -- else if (c != '\\') -- *bp++ = c; -- else { /* \something */ -- c = *++s; -- if (c == 0) { /* \ at end */ -- *bp++ = '\\'; -- break; /* for loop */ -- } -- switch (c) { -- case '\\': *bp++ = '\\'; break; -- case 'n': *bp++ = '\n'; break; -- case 't': *bp++ = '\t'; break; -- case 'b': *bp++ = '\b'; break; -- case 'f': *bp++ = '\f'; break; -- case 'r': *bp++ = '\r'; break; -- default: -- if (!isdigit(c)) { -- *bp++ = c; -- break; -- } -- n = c - '0'; -- if (isdigit(s[1])) { -- n = 8 * n + *++s - '0'; -- if (isdigit(s[1])) -- n = 8 * n + *++s - '0'; -- } -- *bp++ = n; -- break; -- } -- } -- } -- *bp++ = 0; -- return (char *) buf; --} -//GO.SYSIN DD tran.c -echo proctab.c 1>&2 -sed 's/.//' >proctab.c <<'//GO.SYSIN DD proctab.c' --#include <stdio.h> --#include "awk.h" --#include "ytab.h" -- --static char *printname[92] = { -- (char *) "FIRSTTOKEN", /* 258 */ -- (char *) "PROGRAM", /* 259 */ -- (char *) "PASTAT", /* 260 */ -- (char *) "PASTAT2", /* 261 */ -- (char *) "XBEGIN", /* 262 */ -- (char *) "XEND", /* 263 */ -- (char *) "NL", /* 264 */ -- (char *) "ARRAY", /* 265 */ -- (char *) "MATCH", /* 266 */ -- (char *) "NOTMATCH", /* 267 */ -- (char *) "MATCHOP", /* 268 */ -- (char *) "FINAL", /* 269 */ -- (char *) "DOT", /* 270 */ -- (char *) "ALL", /* 271 */ -- (char *) "CCL", /* 272 */ -- (char *) "NCCL", /* 273 */ -- (char *) "CHAR", /* 274 */ -- (char *) "OR", /* 275 */ -- (char *) "STAR", /* 276 */ -- (char *) "QUEST", /* 277 */ -- (char *) "PLUS", /* 278 */ -- (char *) "AND", /* 279 */ -- (char *) "BOR", /* 280 */ -- (char *) "APPEND", /* 281 */ -- (char *) "EQ", /* 282 */ -- (char *) "GE", /* 283 */ -- (char *) "GT", /* 284 */ -- (char *) "LE", /* 285 */ -- (char *) "LT", /* 286 */ -- (char *) "NE", /* 287 */ -- (char *) "IN", /* 288 */ -- (char *) "ARG", /* 289 */ -- (char *) "BLTIN", /* 290 */ -- (char *) "BREAK", /* 291 */ -- (char *) "CLOSE", /* 292 */ -- (char *) "CONTINUE", /* 293 */ -- (char *) "DELETE", /* 294 */ -- (char *) "DO", /* 295 */ -- (char *) "EXIT", /* 296 */ -- (char *) "FOR", /* 297 */ -- (char *) "FUNC", /* 298 */ -- (char *) "SUB", /* 299 */ -- (char *) "GSUB", /* 300 */ -- (char *) "IF", /* 301 */ -- (char *) "INDEX", /* 302 */ -- (char *) "LSUBSTR", /* 303 */ -- (char *) "MATCHFCN", /* 304 */ -- (char *) "NEXT", /* 305 */ -- (char *) "NEXTFILE", /* 306 */ -- (char *) "ADD", /* 307 */ -- (char *) "MINUS", /* 308 */ -- (char *) "MULT", /* 309 */ -- (char *) "DIVIDE", /* 310 */ -- (char *) "MOD", /* 311 */ -- (char *) "ASSIGN", /* 312 */ -- (char *) "ASGNOP", /* 313 */ -- (char *) "ADDEQ", /* 314 */ -- (char *) "SUBEQ", /* 315 */ -- (char *) "MULTEQ", /* 316 */ -- (char *) "DIVEQ", /* 317 */ -- (char *) "MODEQ", /* 318 */ -- (char *) "POWEQ", /* 319 */ -- (char *) "PRINT", /* 320 */ -- (char *) "PRINTF", /* 321 */ -- (char *) "SPRINTF", /* 322 */ -- (char *) "ELSE", /* 323 */ -- (char *) "INTEST", /* 324 */ -- (char *) "CONDEXPR", /* 325 */ -- (char *) "POSTINCR", /* 326 */ -- (char *) "PREINCR", /* 327 */ -- (char *) "POSTDECR", /* 328 */ -- (char *) "PREDECR", /* 329 */ -- (char *) "VAR", /* 330 */ -- (char *) "IVAR", /* 331 */ -- (char *) "VARNF", /* 332 */ -- (char *) "CALL", /* 333 */ -- (char *) "NUMBER", /* 334 */ -- (char *) "STRING", /* 335 */ -- (char *) "REGEXPR", /* 336 */ -- (char *) "GETLINE", /* 337 */ -- (char *) "SUBSTR", /* 338 */ -- (char *) "SPLIT", /* 339 */ -- (char *) "RETURN", /* 340 */ -- (char *) "WHILE", /* 341 */ -- (char *) "CAT", /* 342 */ -- (char *) "UMINUS", /* 343 */ -- (char *) "NOT", /* 344 */ -- (char *) "POWER", /* 345 */ -- (char *) "INCR", /* 346 */ -- (char *) "DECR", /* 347 */ -- (char *) "INDIRECT", /* 348 */ -- (char *) "LASTTOKEN", /* 349 */ --}; -- -- --Cell *(*proctab[92])(Node **, int) = { -- nullproc, /* FIRSTTOKEN */ -- program, /* PROGRAM */ -- pastat, /* PASTAT */ -- dopa2, /* PASTAT2 */ -- nullproc, /* XBEGIN */ -- nullproc, /* XEND */ -- nullproc, /* NL */ -- array, /* ARRAY */ -- matchop, /* MATCH */ -- matchop, /* NOTMATCH */ -- nullproc, /* MATCHOP */ -- nullproc, /* FINAL */ -- nullproc, /* DOT */ -- nullproc, /* ALL */ -- nullproc, /* CCL */ -- nullproc, /* NCCL */ -- nullproc, /* CHAR */ -- nullproc, /* OR */ -- nullproc, /* STAR */ -- nullproc, /* QUEST */ -- nullproc, /* PLUS */ -- boolop, /* AND */ -- boolop, /* BOR */ -- nullproc, /* APPEND */ -- relop, /* EQ */ -- relop, /* GE */ -- relop, /* GT */ -- relop, /* LE */ -- relop, /* LT */ -- relop, /* NE */ -- instat, /* IN */ -- arg, /* ARG */ -- bltin, /* BLTIN */ -- jump, /* BREAK */ -- closefile, /* CLOSE */ -- jump, /* CONTINUE */ -- awkdelete, /* DELETE */ -- dostat, /* DO */ -- jump, /* EXIT */ -- forstat, /* FOR */ -- nullproc, /* FUNC */ -- sub, /* SUB */ -- gsub, /* GSUB */ -- ifstat, /* IF */ -- sindex, /* INDEX */ -- nullproc, /* LSUBSTR */ -- matchop, /* MATCHFCN */ -- jump, /* NEXT */ -- jump, /* NEXTFILE */ -- arith, /* ADD */ -- arith, /* MINUS */ -- arith, /* MULT */ -- arith, /* DIVIDE */ -- arith, /* MOD */ -- assign, /* ASSIGN */ -- nullproc, /* ASGNOP */ -- assign, /* ADDEQ */ -- assign, /* SUBEQ */ -- assign, /* MULTEQ */ -- assign, /* DIVEQ */ -- assign, /* MODEQ */ -- assign, /* POWEQ */ -- printstat, /* PRINT */ -- awkprintf, /* PRINTF */ -- awksprintf, /* SPRINTF */ -- nullproc, /* ELSE */ -- intest, /* INTEST */ -- condexpr, /* CONDEXPR */ -- incrdecr, /* POSTINCR */ -- incrdecr, /* PREINCR */ -- incrdecr, /* POSTDECR */ -- incrdecr, /* PREDECR */ -- nullproc, /* VAR */ -- nullproc, /* IVAR */ -- getnf, /* VARNF */ -- call, /* CALL */ -- nullproc, /* NUMBER */ -- nullproc, /* STRING */ -- nullproc, /* REGEXPR */ -- getline, /* GETLINE */ -- substr, /* SUBSTR */ -- split, /* SPLIT */ -- jump, /* RETURN */ -- whilestat, /* WHILE */ -- cat, /* CAT */ -- arith, /* UMINUS */ -- boolop, /* NOT */ -- arith, /* POWER */ -- nullproc, /* INCR */ -- nullproc, /* DECR */ -- indirect, /* INDIRECT */ -- nullproc, /* LASTTOKEN */ --}; -- --char *tokname(int n) --{ -- static char buf[100]; -- -- if (n < FIRSTTOKEN || n > LASTTOKEN) { -- sprintf(buf, "token %d", n); -- return buf; -- } -- return printname[n-FIRSTTOKEN]; --} -//GO.SYSIN DD proctab.c -echo missing95.c 1>&2 -sed 's/.//' >missing95.c <<'//GO.SYSIN DD missing95.c' --/* popen and pclose are not part of win 95 and nt, -- but it appears that _popen and _pclose "work". -- if this won't load, use the return NULL statements. */ -- --#include <stdio.h>
--FILE *popen(char *s, char *m) { -- return _popen(s, m); /* return NULL; */ --}
-- --int pclose(FILE *f) { -- return _pclose(f); /* return NULL; */ --}
-//GO.SYSIN DD missing95.c -echo ytabc.bak 1>&2 -sed 's/.//' >ytabc.bak <<'//GO.SYSIN DD ytabc.bak' --/* A Bison parser, made by GNU Bison 1.875. */ -- --/* Skeleton parser for Yacc-like parsing with Bison, -- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2, or (at your option) -- any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place - Suite 330, -- Boston, MA 02111-1307, USA. */ -- --/* As a special exception, when this file is copied by Bison into a -- Bison output file, you may use that output file without restriction. -- This special exception was added by the Free Software Foundation -- in version 1.24 of Bison. */ -- --/* Written by Richard Stallman by simplifying the original so called -- ``semantic'' parser. */ -- --/* All symbols defined below should begin with yy or YY, to avoid -- infringing on user name space. This should be done even for local -- variables, as they might otherwise be expanded by user macros. -- There are some unavoidable exceptions within include files to -- define necessary library symbols; they are noted "INFRINGES ON -- USER NAME SPACE" below. */ -- --/* Identify Bison output. */ --#define YYBISON 1 -- --/* Skeleton name. */ --#define YYSKELETON_NAME "yacc.c" -- --/* Pure parsers. */ --#define YYPURE 0 -- --/* Using locations. */ --#define YYLSP_NEEDED 0 -- -- -- --/* Tokens. */ --#ifndef YYTOKENTYPE --# define YYTOKENTYPE -- /* Put the tokens into the symbol table, so that GDB and other debuggers -- know about them. */ -- enum yytokentype { -- FIRSTTOKEN = 258, -- PROGRAM = 259, -- PASTAT = 260, -- PASTAT2 = 261, -- XBEGIN = 262, -- XEND = 263, -- NL = 264, -- ARRAY = 265, -- MATCH = 266, -- NOTMATCH = 267, -- MATCHOP = 268, -- FINAL = 269, -- DOT = 270, -- ALL = 271, -- CCL = 272, -- NCCL = 273, -- CHAR = 274, -- OR = 275, -- STAR = 276, -- QUEST = 277, -- PLUS = 278, -- AND = 279, -- BOR = 280, -- APPEND = 281, -- EQ = 282, -- GE = 283, -- GT = 284, -- LE = 285, -- LT = 286, -- NE = 287, -- IN = 288, -- ARG = 289, -- BLTIN = 290, -- BREAK = 291, -- CLOSE = 292, -- CONTINUE = 293, -- DELETE = 294, -- DO = 295, -- EXIT = 296, -- FOR = 297, -- FUNC = 298, -- SUB = 299, -- GSUB = 300, -- IF = 301, -- INDEX = 302, -- LSUBSTR = 303, -- MATCHFCN = 304, -- NEXT = 305, -- NEXTFILE = 306, -- ADD = 307, -- MINUS = 308, -- MULT = 309, -- DIVIDE = 310, -- MOD = 311, -- ASSIGN = 312, -- ASGNOP = 313, -- ADDEQ = 314, -- SUBEQ = 315, -- MULTEQ = 316, -- DIVEQ = 317, -- MODEQ = 318, -- POWEQ = 319, -- PRINT = 320, -- PRINTF = 321, -- SPRINTF = 322, -- ELSE = 323, -- INTEST = 324, -- CONDEXPR = 325, -- POSTINCR = 326, -- PREINCR = 327, -- POSTDECR = 328, -- PREDECR = 329, -- VAR = 330, -- IVAR = 331, -- VARNF = 332, -- CALL = 333, -- NUMBER = 334, -- STRING = 335, -- REGEXPR = 336, -- GETLINE = 337, -- SUBSTR = 338, -- SPLIT = 339, -- RETURN = 340, -- WHILE = 341, -- CAT = 342, -- UMINUS = 343, -- NOT = 344, -- POWER = 345, -- INCR = 346, -- DECR = 347, -- INDIRECT = 348, -- LASTTOKEN = 349 -- }; --#endif --#define FIRSTTOKEN 258 --#define PROGRAM 259 --#define PASTAT 260 --#define PASTAT2 261 --#define XBEGIN 262 --#define XEND 263 --#define NL 264 --#define ARRAY 265 --#define MATCH 266 --#define NOTMATCH 267 --#define MATCHOP 268 --#define FINAL 269 --#define DOT 270 --#define ALL 271 --#define CCL 272 --#define NCCL 273 --#define CHAR 274 --#define OR 275 --#define STAR 276 --#define QUEST 277 --#define PLUS 278 --#define AND 279 --#define BOR 280 --#define APPEND 281 --#define EQ 282 --#define GE 283 --#define GT 284 --#define LE 285 --#define LT 286 --#define NE 287 --#define IN 288 --#define ARG 289 --#define BLTIN 290 --#define BREAK 291 --#define CLOSE 292 --#define CONTINUE 293 --#define DELETE 294 --#define DO 295 --#define EXIT 296 --#define FOR 297 --#define FUNC 298 --#define SUB 299 --#define GSUB 300 --#define IF 301 --#define INDEX 302 --#define LSUBSTR 303 --#define MATCHFCN 304 --#define NEXT 305 --#define NEXTFILE 306 --#define ADD 307 --#define MINUS 308 --#define MULT 309 --#define DIVIDE 310 --#define MOD 311 --#define ASSIGN 312 --#define ASGNOP 313 --#define ADDEQ 314 --#define SUBEQ 315 --#define MULTEQ 316 --#define DIVEQ 317 --#define MODEQ 318 --#define POWEQ 319 --#define PRINT 320 --#define PRINTF 321 --#define SPRINTF 322 --#define ELSE 323 --#define INTEST 324 --#define CONDEXPR 325 --#define POSTINCR 326 --#define PREINCR 327 --#define POSTDECR 328 --#define PREDECR 329 --#define VAR 330 --#define IVAR 331 --#define VARNF 332 --#define CALL 333 --#define NUMBER 334 --#define STRING 335 --#define REGEXPR 336 --#define GETLINE 337 --#define SUBSTR 338 --#define SPLIT 339 --#define RETURN 340 --#define WHILE 341 --#define CAT 342 --#define UMINUS 343 --#define NOT 344 --#define POWER 345 --#define INCR 346 --#define DECR 347 --#define INDIRECT 348 --#define LASTTOKEN 349 -- -- -- -- --/* Copy the first part of user declarations. */ --#line 25 "awkgram.y" -- --#include <stdio.h> --#include <string.h> --#include "awk.h" -- --void checkdup(Node *list, Cell *item); --int yywrap(void) { return(1); } -- --Node *beginloc = 0; --Node *endloc = 0; --int infunc = 0; /* = 1 if in arglist or body of func */ --int inloop = 0; /* = 1 if in while, for, do */ --char *curfname = 0; /* current function name */ --Node *arglist = 0; /* list of args for current function */ -- -- --/* Enabling traces. */ --#ifndef YYDEBUG --# define YYDEBUG 0 --#endif -- --/* Enabling verbose error messages. */ --#ifdef YYERROR_VERBOSE --# undef YYERROR_VERBOSE --# define YYERROR_VERBOSE 1 --#else --# define YYERROR_VERBOSE 0 --#endif -- --#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) --#line 41 "awkgram.y" --typedef union YYSTYPE { -- Node *p; -- Cell *cp; -- int i; -- char *s; --} YYSTYPE; --/* Line 191 of yacc.c. */ --#line 286 "y.tab.c" --# define yystype YYSTYPE /* obsolescent; will be withdrawn */ --# define YYSTYPE_IS_DECLARED 1 --# define YYSTYPE_IS_TRIVIAL 1 --#endif -- -- -- --/* Copy the second part of user declarations. */ -- -- --/* Line 214 of yacc.c. */ --#line 298 "y.tab.c" -- --#if ! defined (yyoverflow) || YYERROR_VERBOSE -- --/* The parser invokes alloca or malloc; define the necessary symbols. */ -- --# if YYSTACK_USE_ALLOCA --# define YYSTACK_ALLOC alloca --# else --# ifndef YYSTACK_USE_ALLOCA --# if defined (alloca) || defined (_ALLOCA_H) --# define YYSTACK_ALLOC alloca --# else --# ifdef __GNUC__ --# define YYSTACK_ALLOC __builtin_alloca --# endif --# endif --# endif --# endif -- --# ifdef YYSTACK_ALLOC -- /* Pacify GCC's `empty if-body' warning. */ --# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) --# else --# if defined (__STDC__) || defined (__cplusplus) --# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ --# define YYSIZE_T size_t --# endif --# define YYSTACK_ALLOC malloc --# define YYSTACK_FREE free --# endif --#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ -- -- --#if (! defined (yyoverflow) \ -- && (! defined (__cplusplus) \ -- || (YYSTYPE_IS_TRIVIAL))) -- --/* A type that is properly aligned for any stack member. */ --union yyalloc --{ -- short yyss; -- YYSTYPE yyvs; -- }; -- --/* The size of the maximum gap between one aligned stack and the next. */ --# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) -- --/* The size of an array large to enough to hold all stacks, each with -- N elements. */ --# define YYSTACK_BYTES(N) \ -- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ -- + YYSTACK_GAP_MAXIMUM) -- --/* Copy COUNT objects from FROM to TO. The source and destination do -- not overlap. */ --# ifndef YYCOPY --# if 1 < __GNUC__ --# define YYCOPY(To, From, Count) \ -- __builtin_memcpy (To, From, (Count) * sizeof (*(From))) --# else --# define YYCOPY(To, From, Count) \ -- do \ -- { \ -- register YYSIZE_T yyi; \ -- for (yyi = 0; yyi < (Count); yyi++) \ -- (To)[yyi] = (From)[yyi]; \ -- } \ -- while (0) --# endif --# endif -- --/* Relocate STACK from its old location to the new one. The -- local variables YYSIZE and YYSTACKSIZE give the old and new number of -- elements in the stack, and YYPTR gives the new location of the -- stack. Advance YYPTR to a properly aligned location for the next -- stack. */ --# define YYSTACK_RELOCATE(Stack) \ -- do \ -- { \ -- YYSIZE_T yynewbytes; \ -- YYCOPY (&yyptr->Stack, Stack, yysize); \ -- Stack = &yyptr->Stack; \ -- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ -- yyptr += yynewbytes / sizeof (*yyptr); \ -- } \ -- while (0) -- --#endif -- --#if defined (__STDC__) || defined (__cplusplus) -- typedef signed char yysigned_char; --#else -- typedef short yysigned_char; --#endif -- --/* YYFINAL -- State number of the termination state. */ --#define YYFINAL 8 --/* YYLAST -- Last index in YYTABLE. */ --#define YYLAST 4569 -- --/* YYNTOKENS -- Number of terminals. */ --#define YYNTOKENS 111 --/* YYNNTS -- Number of nonterminals. */ --#define YYNNTS 49 --/* YYNRULES -- Number of rules. */ --#define YYNRULES 185 --/* YYNRULES -- Number of states. */ --#define YYNSTATES 367 -- --/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ --#define YYUNDEFTOK 2 --#define YYMAXUTOK 349 -- --#define YYTRANSLATE(YYX) \ -- ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -- --/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ --static const unsigned char yytranslate[] = --{ -- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 103, 2, 2, -- 12, 16, 102, 100, 9, 101, 2, 15, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 93, 14, -- 2, 2, 2, 92, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 18, 2, 19, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 11, 13, 17, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -- 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, -- 5, 6, 7, 8, 10, 20, 21, 22, 23, 24, -- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -- 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, -- 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, -- 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, -- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, -- 85, 86, 87, 88, 89, 90, 91, 94, 95, 96, -- 97, 98, 99, 104, 105, 106, 107, 108, 109, 110 --}; -- --#if YYDEBUG --/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in -- YYRHS. */ --static const unsigned short yyprhs[] = --{ -- 0, 0, 3, 5, 7, 9, 12, 14, 17, 19, -- 22, 24, 27, 29, 32, 33, 46, 47, 58, 59, -- 68, 70, 72, 77, 79, 82, 84, 87, 88, 90, -- 91, 93, 94, 96, 98, 102, 104, 106, 111, 115, -- 122, 126, 131, 136, 137, 147, 149, 153, 155, 159, -- 163, 169, 173, 177, 181, 185, 189, 195, 198, 200, -- 202, 206, 212, 216, 220, 224, 228, 232, 236, 240, -- 244, 248, 252, 256, 262, 267, 271, 274, 276, 278, -- 282, 286, 288, 292, 293, 295, 299, 301, 303, 305, -- 307, 310, 313, 315, 318, 320, 323, 324, 329, 331, -- 334, 339, 344, 349, 352, 358, 361, 363, 365, 367, -- 370, 373, 376, 377, 378, 388, 392, 395, 397, 402, -- 405, 409, 412, 415, 419, 422, 425, 426, 430, 433, -- 435, 438, 440, 442, 447, 451, 455, 459, 463, 467, -- 471, 474, 477, 480, 484, 489, 491, 495, 500, 503, -- 506, 509, 512, 515, 520, 524, 527, 529, 536, 543, -- 547, 554, 561, 563, 572, 581, 588, 593, 595, 602, -- 609, 618, 627, 636, 643, 645, 647, 652, 654, 657, -- 658, 660, 664, 666, 668, 670 --}; -- --/* YYRHS -- A `-1'-separated list of the rules' RHS. */ --static const short yyrhs[] = --{ -- 112, 0, -1, 129, -1, 1, -1, 34, -1, 113, -- 10, -1, 35, -1, 114, 10, -1, 9, -1, 115, -- 10, -1, 50, -1, 116, 10, -1, 78, -1, 117, -- 10, -1, -1, 52, 12, 128, 14, 126, 136, 14, -- 126, 128, 146, 119, 149, -1, -1, 52, 12, 128, -- 14, 14, 126, 128, 146, 120, 149, -1, -1, 52, -- 12, 158, 43, 158, 146, 121, 149, -1, 85, -1, -- 88, -1, 56, 12, 136, 146, -1, 11, -1, 124, -- 10, -1, 10, -1, 125, 10, -1, -1, 125, -1, -- -1, 141, -1, -1, 147, -1, 127, -1, 127, 133, -- 127, -1, 136, -1, 130, -1, 130, 124, 153, 17, -- -1, 130, 9, 130, -1, 130, 9, 130, 124, 153, -- 17, -1, 124, 153, 17, -1, 7, 124, 153, 17, -- -1, 8, 124, 153, 17, -1, -1, 53, 122, 12, -- 157, 146, 132, 124, 153, 17, -1, 131, -1, 133, -- 127, 131, -1, 136, -1, 134, 115, 136, -1, 156, -- 68, 135, -1, 135, 92, 135, 93, 135, -1, 135, -- 114, 135, -1, 135, 113, 135, -1, 135, 23, 144, -- -1, 135, 23, 135, -1, 135, 43, 158, -1, 12, -- 137, 16, 43, 158, -1, 135, 155, -1, 143, -1, -- 155, -1, 156, 68, 136, -1, 136, 92, 136, 93, -- 136, -1, 136, 114, 136, -1, 136, 113, 136, -1, -- 136, 37, 136, -1, 136, 38, 136, -1, 136, 39, -- 136, -1, 136, 40, 136, -1, 136, 41, 136, -1, -- 136, 42, 136, -1, 136, 23, 144, -1, 136, 23, -- 136, -1, 136, 43, 158, -1, 12, 137, 16, 43, -- 158, -1, 136, 13, 94, 156, -1, 136, 13, 94, -- -1, 136, 155, -1, 143, -1, 155, -1, 136, 115, -- 136, -1, 137, 115, 136, -1, 135, -1, 138, 115, -- 135, -1, -1, 138, -1, 12, 137, 16, -1, 75, -- -1, 76, -1, 10, -1, 14, -1, 141, 10, -1, -- 141, 14, -1, 17, -1, 142, 10, -1, 144, -1, -- 105, 143, -1, -1, 15, 145, 91, 15, -1, 16, -- -1, 146, 10, -1, 140, 139, 13, 155, -1, 140, -- 139, 36, 155, -1, 140, 139, 39, 155, -1, 140, -- 139, -1, 49, 158, 18, 134, 19, -1, 49, 158, -- -1, 136, -1, 1, -1, 125, -1, 14, 126, -1, -- 46, 148, -1, 48, 148, -1, -1, -1, 116, 150, -- 149, 151, 98, 12, 136, 16, 148, -1, 51, 136, -- 148, -1, 51, 148, -1, 118, -1, 123, 149, 117, -- 149, -1, 123, 149, -1, 124, 153, 142, -1, 60, -- 148, -1, 61, 148, -1, 97, 136, 148, -1, 97, -- 148, -1, 147, 148, -1, -1, 159, 152, 149, -1, -- 14, 126, -1, 149, -1, 153, 149, -1, 54, -1, -- 55, -1, 155, 15, 68, 155, -1, 155, 100, 155, -- -1, 155, 101, 155, -1, 155, 102, 155, -1, 155, -- 15, 155, -1, 155, 103, 155, -1, 155, 106, 155, -- -1, 101, 155, -1, 100, 155, -1, 105, 155, -1, -- 45, 12, 16, -1, 45, 12, 134, 16, -1, 45, -- -1, 88, 12, 16, -1, 88, 12, 134, 16, -1, -- 47, 155, -1, 108, 156, -1, 107, 156, -1, 156, -- 108, -1, 156, 107, -1, 94, 156, 41, 155, -1, -- 94, 41, 155, -1, 94, 156, -1, 94, -1, 57, -- 12, 136, 115, 136, 16, -1, 57, 12, 136, 115, -- 144, 16, -1, 12, 136, 16, -1, 59, 12, 136, -- 115, 144, 16, -1, 59, 12, 136, 115, 136, 16, -- -1, 89, -1, 96, 12, 136, 115, 158, 115, 136, -- 16, -1, 96, 12, 136, 115, 158, 115, 144, 16, -- -1, 96, 12, 136, 115, 158, 16, -1, 77, 12, -- 134, 16, -1, 90, -1, 154, 12, 144, 115, 136, -- 16, -1, 154, 12, 136, 115, 136, 16, -1, 154, -- 12, 144, 115, 136, 115, 156, 16, -1, 154, 12, -- 136, 115, 136, 115, 156, 16, -1, 95, 12, 136, -- 115, 136, 115, 136, 16, -1, 95, 12, 136, 115, -- 136, 16, -1, 156, -1, 158, -1, 158, 18, 134, -- 19, -1, 86, -1, 109, 155, -1, -1, 85, -1, -- 157, 115, 85, -1, 85, -1, 44, -1, 87, -1, -- 98, 12, 136, 146, -1 --}; -- --/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ --static const unsigned short yyrline[] = --{ -- 0, 98, 98, 100, 104, 104, 108, 108, 112, 112, -- 116, 116, 120, 120, 124, 124, 126, 126, 128, 128, -- 133, 134, 138, 142, 142, 146, 146, 150, 151, 155, -- 156, 161, 162, 166, 167, 171, 175, 176, 177, 178, -- 179, 180, 182, 184, 184, 189, 190, 194, 195, 199, -- 200, 202, 204, 206, 207, 212, 213, 214, 215, 216, -- 220, 221, 223, 225, 227, 228, 229, 230, 231, 232, -- 233, 234, 239, 240, 241, 244, 247, 248, 249, 253, -- 254, 258, 259, 263, 264, 265, 269, 269, 273, 273, -- 273, 273, 277, 277, 281, 283, 287, 287, 291, 291, -- 295, 298, 301, 304, 305, 306, 307, 308, 312, 313, -- 317, 319, 321, 321, 321, 323, 324, 325, 326, 327, -- 328, 329, 332, 335, 336, 337, 338, 338, 339, 343, -- 344, 348, 348, 352, 353, 354, 355, 356, 357, 358, -- 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, -- 369, 370, 371, 372, 373, 374, 375, 376, 378, 381, -- 382, 384, 389, 390, 392, 394, 396, 397, 398, 400, -- 405, 407, 412, 414, 416, 420, 421, 422, 423, 427, -- 428, 429, 435, 436, 437, 442 --}; --#endif -- --#if YYDEBUG || YYERROR_VERBOSE --/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. -- First, the terminals, then, starting at YYNTOKENS, nonterminals. */ --static const char *const yytname[] = --{ -- "$end", "error", "$undefined", "FIRSTTOKEN", "PROGRAM", "PASTAT", -- "PASTAT2", "XBEGIN", "XEND", "','", "NL", "'{'", "'('", "'|'", "';'", -- "'/'", "')'", "'}'", "'['", "']'", "ARRAY", "MATCH", "NOTMATCH", -- "MATCHOP", "FINAL", "DOT", "ALL", "CCL", "NCCL", "CHAR", "OR", "STAR", -- "QUEST", "PLUS", "AND", "BOR", "APPEND", "EQ", "GE", "GT", "LE", "LT", -- "NE", "IN", "ARG", "BLTIN", "BREAK", "CLOSE", "CONTINUE", "DELETE", -- "DO", "EXIT", "FOR", "FUNC", "SUB", "GSUB", "IF", "INDEX", "LSUBSTR", -- "MATCHFCN", "NEXT", "NEXTFILE", "ADD", "MINUS", "MULT", "DIVIDE", "MOD", -- "ASSIGN", "ASGNOP", "ADDEQ", "SUBEQ", "MULTEQ", "DIVEQ", "MODEQ", -- "POWEQ", "PRINT", "PRINTF", "SPRINTF", "ELSE", "INTEST", "CONDEXPR", -- "POSTINCR", "PREINCR", "POSTDECR", "PREDECR", "VAR", "IVAR", "VARNF", -- "CALL", "NUMBER", "STRING", "REGEXPR", "'?'", "':'", "GETLINE", -- "SUBSTR", "SPLIT", "RETURN", "WHILE", "CAT", "'+'", "'-'", "'*'", "'%'", -- "UMINUS", "NOT", "POWER", "INCR", "DECR", "INDIRECT", "LASTTOKEN", -- "$accept", "program", "and", "bor", "comma", "do", "else", "for", "@1", -- "@2", "@3", "funcname", "if", "lbrace", "nl", "opt_nl", "opt_pst", -- "opt_simple_stmt", "pas", "pa_pat", "pa_stat", "@4", "pa_stats", -- "patlist", "ppattern", "pattern", "plist", "pplist", "prarg", "print", -- "pst", "rbrace", "re", "reg_expr", "@5", "rparen", "simple_stmt", "st", -- "stmt", "@6", "@7", "@8", "stmtlist", "subop", "term", "var", "varlist", -- "varname", "while", 0 --}; --#endif -- --# ifdef YYPRINT --/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to -- token YYLEX-NUM. */ --static const unsigned short yytoknum[] = --{ -- 0, 256, 257, 258, 259, 260, 261, 262, 263, 44, -- 264, 123, 40, 124, 59, 47, 41, 125, 91, 93, -- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, -- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, -- 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, -- 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, -- 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, -- 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, -- 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -- 335, 336, 63, 58, 337, 338, 339, 340, 341, 342, -- 43, 45, 42, 37, 343, 344, 345, 346, 347, 348, -- 349 --}; --# endif -- --/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ --static const unsigned char yyr1[] = --{ -- 0, 111, 112, 112, 113, 113, 114, 114, 115, 115, -- 116, 116, 117, 117, 119, 118, 120, 118, 121, 118, -- 122, 122, 123, 124, 124, 125, 125, 126, 126, 127, -- 127, 128, 128, 129, 129, 130, 131, 131, 131, 131, -- 131, 131, 131, 132, 131, 133, 133, 134, 134, 135, -- 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, -- 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, -- 136, 136, 136, 136, 136, 136, 136, 136, 136, 137, -- 137, 138, 138, 139, 139, 139, 140, 140, 141, 141, -- 141, 141, 142, 142, 143, 143, 145, 144, 146, 146, -- 147, 147, 147, 147, 147, 147, 147, 147, 148, 148, -- 149, 149, 150, 151, 149, 149, 149, 149, 149, 149, -- 149, 149, 149, 149, 149, 149, 152, 149, 149, 153, -- 153, 154, 154, 155, 155, 155, 155, 155, 155, 155, -- 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, -- 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, -- 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, -- 155, 155, 155, 155, 155, 156, 156, 156, 156, 157, -- 157, 157, 158, 158, 158, 159 --}; -- --/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ --static const unsigned char yyr2[] = --{ -- 0, 2, 1, 1, 1, 2, 1, 2, 1, 2, -- 1, 2, 1, 2, 0, 12, 0, 10, 0, 8, -- 1, 1, 4, 1, 2, 1, 2, 0, 1, 0, -- 1, 0, 1, 1, 3, 1, 1, 4, 3, 6, -- 3, 4, 4, 0, 9, 1, 3, 1, 3, 3, -- 5, 3, 3, 3, 3, 3, 5, 2, 1, 1, -- 3, 5, 3, 3, 3, 3, 3, 3, 3, 3, -- 3, 3, 3, 5, 4, 3, 2, 1, 1, 3, -- 3, 1, 3, 0, 1, 3, 1, 1, 1, 1, -- 2, 2, 1, 2, 1, 2, 0, 4, 1, 2, -- 4, 4, 4, 2, 5, 2, 1, 1, 1, 2, -- 2, 2, 0, 0, 9, 3, 2, 1, 4, 2, -- 3, 2, 2, 3, 2, 2, 0, 3, 2, 1, -- 2, 1, 1, 4, 3, 3, 3, 3, 3, 3, -- 2, 2, 2, 3, 4, 1, 3, 4, 2, 2, -- 2, 2, 2, 4, 3, 2, 1, 6, 6, 3, -- 6, 6, 1, 8, 8, 6, 4, 1, 6, 6, -- 8, 8, 8, 6, 1, 1, 4, 1, 2, 0, -- 1, 3, 1, 1, 1, 4 --}; -- --/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state -- STATE-NUM when YYTABLE doesn't specify something else to do. Zero -- means the default is an error. */ --static const unsigned char yydefact[] = --{ -- 0, 3, 88, 89, 0, 33, 2, 30, 1, 0, -- 0, 23, 0, 96, 183, 145, 0, 0, 131, 132, -- 0, 0, 0, 182, 177, 184, 0, 162, 167, 156, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, -- 45, 29, 35, 77, 94, 0, 78, 174, 175, 90, -- 91, 0, 0, 0, 0, 0, 0, 0, 0, 148, -- 174, 20, 21, 0, 0, 0, 0, 0, 0, 155, -- 0, 0, 141, 140, 95, 142, 150, 149, 178, 107, -- 24, 27, 0, 0, 0, 10, 0, 0, 0, 0, -- 0, 86, 87, 0, 0, 112, 117, 0, 0, 106, -- 83, 0, 129, 0, 126, 0, 0, 34, 0, 0, -- 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, -- 0, 152, 151, 0, 0, 0, 8, 159, 0, 0, -- 0, 0, 143, 0, 47, 0, 179, 0, 0, 0, -- 146, 0, 154, 0, 0, 0, 25, 28, 128, 27, -- 108, 110, 111, 105, 0, 116, 0, 0, 121, 122, -- 0, 124, 0, 11, 0, 119, 0, 0, 81, 84, -- 103, 58, 59, 174, 125, 40, 130, 0, 38, 0, -- 46, 75, 71, 70, 64, 65, 66, 67, 68, 69, -- 72, 0, 5, 63, 7, 62, 0, 94, 0, 137, -- 134, 135, 136, 138, 139, 60, 0, 41, 42, 9, -- 79, 0, 80, 97, 144, 0, 180, 0, 0, 0, -- 166, 147, 153, 0, 0, 26, 109, 0, 115, 0, -- 32, 175, 0, 123, 0, 113, 12, 0, 92, 120, -- 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, -- 0, 0, 127, 0, 37, 74, 0, 0, 0, 133, -- 176, 73, 48, 98, 0, 43, 0, 94, 0, 94, -- 0, 0, 0, 27, 0, 22, 185, 0, 13, 118, -- 93, 85, 0, 54, 53, 55, 0, 52, 51, 82, -- 100, 101, 102, 49, 0, 61, 0, 0, 181, 99, -- 0, 157, 158, 161, 160, 173, 0, 165, 0, 104, -- 27, 0, 0, 0, 0, 0, 0, 39, 169, 0, -- 168, 0, 0, 0, 0, 94, 0, 0, 18, 0, -- 56, 0, 50, 0, 0, 0, 172, 163, 164, 0, -- 27, 0, 0, 171, 170, 44, 16, 0, 19, 0, -- 0, 0, 114, 17, 14, 0, 15 --}; -- --/* YYDEFGOTO[NTERM-NUM]. */ --static const short yydefgoto[] = --{ -- -1, 4, 120, 121, 225, 95, 247, 96, 365, 360, -- 351, 63, 97, 98, 160, 158, 5, 239, 6, 39, -- 40, 310, 41, 143, 178, 99, 54, 179, 180, 100, -- 7, 249, 43, 44, 55, 275, 101, 161, 102, 174, -- 287, 187, 103, 45, 46, 47, 227, 48, 104 --}; -- --/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing -- STATE-NUM. */ --#define YYPACT_NINF -323 --static const short yypact[] = --{ -- 680, -323, -323, -323, 34, 1573, -323, 106, -323, 29, -- 29, -323, 4106, -323, -323, 41, 4460, -73, -323, -323, -- 44, 92, 105, -323, -323, -323, 113, -323, -323, -11, -- 121, 131, 4460, 4460, 4165, 255, 255, 4460, 812, 94, -- -323, 174, 3436, -323, -323, 132, 130, -61, 30, -323, -- -323, 812, 812, 1663, 53, 64, 3929, 4106, 4460, 130, -- -21, -323, -323, 159, 4106, 4106, 4106, 3988, 4460, 65, -- 4106, 4106, 60, 60, -323, 60, -323, -323, -323, -323, -- -323, 162, 188, 188, 7, -323, 2182, 161, 196, 188, -- 188, -323, -323, 2182, 199, 176, -323, 1416, 812, 3436, -- 4224, 188, -323, 879, -323, 4106, 812, 1573, 118, 4106, -- -323, -323, 4106, 4106, 4106, 4106, 4106, 4106, 7, 4106, -- 2241, 2300, 130, 4106, 4283, 4460, 4460, 4460, 4460, 4460, -- 4106, -323, -323, 4106, 946, 1013, -323, -323, 2359, 157, -- 2359, 202, -323, 61, 3436, 2626, 133, 2023, 2023, 62, -- -323, 81, 130, 4460, 2023, 2023, -323, 214, -323, 162, -- 214, -323, -323, 209, 2123, -323, 1482, 4106, -323, -323, -- 2123, -323, 4106, -323, 1416, 156, 1080, 4106, 3811, 237, -- 83, -323, 130, -41, -323, -323, -323, 1416, 29, 1147, -- -323, 255, 3684, -323, 3684, 3684, 3684, 3684, 3684, 3684, -- -323, 2716, -323, 3605, -323, 3526, 2023, 237, 4460, 60, -- 58, 58, 60, 60, 60, 3436, 22, -323, -323, -323, -- 3436, 7, 3436, -323, -323, 2359, -323, 98, 2359, 2359, -- -323, -323, 130, 2359, 55, -323, -323, 4106, -323, 233, -- -323, -7, 2806, -323, 2806, -323, -323, 1215, -323, 238, -- 140, 4342, 7, 4342, 2418, 2477, 130, 2536, 4460, 4460, -- 4460, 4342, -323, 812, -323, -323, 4106, 2359, 2359, 130, -- -323, -323, 3436, -323, -5, 242, 2896, 239, 2986, 241, -- 1753, 149, 36, 191, 7, 242, 242, 163, -323, -323, -- -323, 225, 4106, 4401, -323, -323, 3743, 4047, 3870, 3811, -- 130, 130, 130, 3811, 1282, 3436, 1843, 1933, -323, -323, -- 29, -323, -323, -323, -323, -323, 2359, -323, 2359, -323, -- 162, 4106, 256, 259, 7, 154, 4342, -323, -323, 15, -- -323, 15, 812, 3076, 3166, 258, 1548, 3256, 242, 4106, -- -323, 225, 3811, 260, 262, 1349, -323, -323, -323, 256, -- 162, 1416, 3346, -323, -323, -323, 242, 1548, -323, 188, -- 1416, 256, -323, -323, 242, 1416, -323 --}; -- --/* YYPGOTO[NTERM-NUM]. */ --static const short yypgoto[] = --{ -- -323, -323, -146, -83, 200, -323, -323, -323, -323, -323, -- -323, -323, -323, 19, -80, -153, 234, -322, -323, 179, -- 172, -323, -323, -44, 12, 526, -174, -323, -323, -323, -- -323, -323, -32, -60, -323, -234, -162, -29, -53, -323, -- -323, -323, -13, -323, 269, -16, -323, -75, -323 --}; -- --/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If -- positive, shift that token. If negative, reduce the rule which -- number is the opposite. If zero, do what YYDEFACT says. -- If YYTABLE_NINF, syntax error. */ --#define YYTABLE_NINF -32 --static const short yytable[] = --{ -- 60, 157, 74, 250, 240, 219, 236, 130, 285, 163, -- 286, 133, 61, 69, 349, 62, 60, 60, 60, 76, -- 77, 60, 149, 151, 38, 219, 60, 261, 51, 52, -- 68, 136, 254, 14, 8, 361, 284, 60, 134, 135, -- 11, 270, 60, 200, 175, 136, 131, 132, 133, 193, -- 186, 14, 60, 56, 162, 319, 64, 165, 106, 14, -- 168, 169, 136, 207, 171, 219, 131, 132, 181, 139, -- 136, 136, 184, 124, 23, 24, 25, 224, 230, 157, -- 308, 186, 186, 60, 183, 176, 131, 132, 338, 216, -- 136, 241, 23, 189, 25, 255, 258, 231, 37, 14, -- 23, 24, 25, 105, 65, 11, 153, 136, 60, 60, -- 60, 60, 60, 60, 273, 356, 49, 66, 325, 259, -- 50, 245, 260, 186, 37, 67, 38, 364, 60, 60, -- 321, 60, 60, 70, 262, 238, 186, 60, 60, 60, -- 23, 243, 25, 71, 123, 124, 271, 254, 60, 136, -- 254, 254, 254, 254, 60, 141, 291, 254, 136, 281, -- 127, 128, 60, 136, 129, 317, 129, 336, 277, 279, -- 341, 146, 156, 166, 240, 265, 60, 295, 60, 60, -- 60, 60, 60, 60, 2, 60, 173, 60, 3, 60, -- 60, 294, 60, 282, 289, 240, 254, 357, 156, 60, -- 221, 156, 159, 157, 60, 320, 60, 263, 167, 322, -- 255, 172, 191, 255, 255, 255, 255, 223, 226, 181, -- 255, 181, 181, 181, 235, 181, 60, 237, 60, 181, -- 125, 126, 127, 128, 246, 183, 129, 183, 183, 183, -- 157, 183, 60, 60, 60, 183, 136, 283, 290, 340, -- 304, 186, 309, 138, 140, 312, 60, 314, 335, 255, -- 60, 323, 60, 293, 60, 296, 297, 298, 324, 299, -- 157, 339, 273, 303, 348, 107, 353, 60, 354, 190, -- 60, 60, 60, 60, 188, 59, 0, 60, 0, 60, -- 60, 60, 186, 0, 181, 0, 0, 0, 358, 14, -- 0, 72, 73, 75, 0, 0, 78, 363, 0, 0, -- 183, 122, 366, 343, 0, 344, 0, 60, 60, 345, -- 0, 60, 122, 0, 0, 0, 60, 75, 0, 332, -- 362, 0, 0, 0, 0, 0, 60, 152, 342, 0, -- 23, 24, 25, 0, 0, 0, 0, 228, 229, 0, -- 0, 0, 0, 0, 233, 234, 0, 0, 0, 0, -- 0, 0, 0, 0, 37, 0, 0, 0, 122, 182, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 209, 210, 211, 212, 213, 214, 0, -- 0, 0, 0, 0, 0, 0, 267, 268, 0, 0, -- 0, 0, 0, 122, 122, 0, 122, 122, 0, 0, -- 0, 0, 232, 122, 122, 0, 0, 274, 0, 0, -- 0, 0, 0, 122, 0, 0, 0, 0, 0, 122, -- 0, 0, 0, 0, 0, 0, 0, 256, 0, 0, -- 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 122, 0, 122, 122, 122, 122, 122, 122, 0, -- 122, 0, 122, 0, 122, 122, 0, 269, 0, 0, -- 316, 318, 0, 0, 122, 0, 0, 0, 0, 122, -- 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 329, 331, 0, 0, -- 0, 122, 0, 122, 0, 0, 0, 0, 0, 0, -- 182, 0, 182, 182, 182, 140, 182, 300, 301, 302, -- 182, 42, 0, 0, 0, 0, 0, 0, 53, 0, -- 0, 122, 0, 0, 0, 122, 0, 122, 0, 122, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 256, 0, 0, 256, 256, 256, 256, 0, -- 0, 0, 256, 0, 122, 122, 122, 0, 0, 0, -- 0, 0, 144, 145, 0, 0, 0, 0, 0, 0, -- 147, 148, 144, 144, 0, 182, 154, 155, 0, 0, -- 0, 0, 122, 122, 0, 0, 122, 0, 0, 0, -- 0, 256, 164, 0, 0, 0, 0, 0, 0, 170, -- 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 42, 0, 42, 0, 192, 0, 0, 194, 195, -- 196, 197, 198, 199, 0, 201, 203, 205, 0, 206, -- 0, 0, 0, 0, 0, 0, 215, 0, 0, 144, -- 0, 0, 0, 0, 220, 0, 222, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- -29, 1, 0, 0, 0, 0, 0, -29, -29, 0, -- 2, -29, -29, 242, 3, -29, 0, 0, 244, 0, -- 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, -29, -29, 0, -29, 0, 0, -- 0, 0, 0, -29, -29, -29, 0, -29, 0, -29, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 272, 0, 0, 276, 278, 0, -29, 0, 280, -- 0, 0, 0, 144, 0, -29, -29, -29, -29, -29, -- -29, 0, 0, 0, -29, -29, -29, 0, 0, 0, -- -29, -29, 0, 0, 0, -29, 0, -29, -29, -29, -- 0, 0, 305, 306, 307, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 79, 0, 0, 0, 0, 53, 0, -- 0, 0, 80, 11, 12, 0, 81, 13, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 333, 0, 334, 0, 0, 337, 0, 0, -- 0, 0, 0, 0, 0, 0, 14, 15, 82, 16, -- 83, 84, 85, 86, 87, 352, 18, 19, 88, 20, -- 0, 21, 89, 90, 0, 0, 0, 0, 0, 0, -- 79, 0, 0, 0, 0, 0, 0, 91, 92, 22, -- 11, 12, 0, 81, 13, 0, 185, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 93, -- 94, 0, 32, 33, 0, 0, 0, 34, 0, 35, -- 36, 37, 0, 14, 15, 82, 16, 83, 84, 85, -- 86, 87, 0, 18, 19, 88, 20, 0, 21, 89, -- 90, 0, 0, 0, 0, 0, 0, 79, 0, 0, -- 0, 0, 0, 0, 91, 92, 22, 11, 12, 0, -- 81, 13, 0, 217, 23, 24, 25, 26, 27, 28, -- 0, 0, 0, 29, 30, 31, 93, 94, 0, 32, -- 33, 0, 0, 0, 34, 0, 35, 36, 37, 0, -- 14, 15, 82, 16, 83, 84, 85, 86, 87, 0, -- 18, 19, 88, 20, 0, 21, 89, 90, 0, 0, -- 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, -- 0, 91, 92, 22, 11, 12, 0, 81, 13, 0, -- 218, 23, 24, 25, 26, 27, 28, 0, 0, 0, -- 29, 30, 31, 93, 94, 0, 32, 33, 0, 0, -- 0, 34, 0, 35, 36, 37, 0, 14, 15, 82, -- 16, 83, 84, 85, 86, 87, 0, 18, 19, 88, -- 20, 0, 21, 89, 90, 0, 0, 0, 0, 0, -- 0, 79, 0, 0, 0, 0, 0, 0, 91, 92, -- 22, 11, 12, 0, 81, 13, 0, 248, 23, 24, -- 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, -- 93, 94, 0, 32, 33, 0, 0, 0, 34, 0, -- 35, 36, 37, 0, 14, 15, 82, 16, 83, 84, -- 85, 86, 87, 0, 18, 19, 88, 20, 0, 21, -- 89, 90, 0, 0, 0, 0, 0, 0, 79, 0, -- 0, 0, 0, 0, 0, 91, 92, 22, 11, 12, -- 0, 81, 13, 0, 264, 23, 24, 25, 26, 27, -- 28, 0, 0, 0, 29, 30, 31, 93, 94, 0, -- 32, 33, 0, 0, 0, 34, 0, 35, 36, 37, -- 0, 14, 15, 82, 16, 83, 84, 85, 86, 87, -- 0, 18, 19, 88, 20, 0, 21, 89, 90, 0, -- 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, -- 0, 0, 91, 92, 22, 288, 11, 12, 0, 81, -- 13, 0, 23, 24, 25, 26, 27, 28, 0, 0, -- 0, 29, 30, 31, 93, 94, 0, 32, 33, 0, -- 0, 0, 34, 0, 35, 36, 37, 0, 0, 14, -- 15, 82, 16, 83, 84, 85, 86, 87, 0, 18, -- 19, 88, 20, 0, 21, 89, 90, 0, 0, 0, -- 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, -- 91, 92, 22, 11, 12, 0, 81, 13, 0, 327, -- 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, -- 30, 31, 93, 94, 0, 32, 33, 0, 0, 0, -- 34, 0, 35, 36, 37, 0, 14, 15, 82, 16, -- 83, 84, 85, 86, 87, 0, 18, 19, 88, 20, -- 0, 21, 89, 90, 0, 0, 0, 0, 0, 0, -- 79, 0, 0, 0, 0, 0, 0, 91, 92, 22, -- 11, 12, 0, 81, 13, 0, 355, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 93, -- 94, 0, 32, 33, 0, 0, 0, 34, 0, 35, -- 36, 37, 0, 14, 15, 82, 16, 83, 84, 85, -- 86, 87, 0, 18, 19, 88, 20, 0, 21, 89, -- 90, 0, 0, 0, 0, 0, 0, 79, 0, 0, -- 0, 0, 0, 0, 91, 92, 22, 11, 12, 0, -- 81, 13, 0, 0, 23, 24, 25, 26, 27, 28, -- 0, 0, 0, 29, 30, 31, 93, 94, 0, 32, -- 33, 0, 0, 0, 34, 0, 35, 36, 37, 0, -- 14, 15, 82, 16, 83, 84, 85, 86, 87, 0, -- 18, 19, 88, 20, 0, 21, 89, 90, 0, 0, -- 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, -- 0, 91, 92, 22, 12, 0, -31, 13, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 0, 0, -- 29, 30, 31, 93, 94, 0, 32, 33, 0, 0, -- 0, 34, 0, 35, 36, 37, 14, 15, 0, 16, -- 0, 84, 0, 0, 0, 0, 18, 19, 0, 20, -- 0, 21, 0, 0, 0, 0, 0, 0, 0, 79, -- 0, 0, 0, 0, 0, 0, 0, 91, 92, 22, -- 12, 0, 0, 13, -31, 0, 0, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 0, -- 9, 10, 32, 33, 11, 12, 0, 34, 13, 35, -- 36, 37, 14, 15, 0, 16, 0, 84, 0, 0, -- 0, 0, 18, 19, 0, 20, 0, 21, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 14, 15, 0, -- 16, 0, 0, 91, 92, 22, 17, 18, 19, 0, -- 20, 0, 21, 23, 24, 25, 26, 27, 28, 0, -- 0, 0, 29, 30, 31, 0, 0, 0, 32, 33, -- 22, 0, 0, 34, 0, 35, 36, 37, 23, 24, -- 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 34, 137, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 58, 315, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 58, 328, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 58, 330, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 136, 32, 33, 57, 108, 0, 58, 0, -- 35, 36, 37, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 0, 32, 33, 0, 0, 0, 58, 0, -- 35, 36, 37, 156, 0, 57, 108, 159, 0, 0, -- 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, -- 112, 113, 114, 115, 116, 117, 118, 14, 15, 0, -- 16, 0, 0, 0, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 156, 0, 12, 0, 159, 13, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 119, 0, 29, 30, 31, -- 0, 0, 0, 32, 33, 0, 14, 15, 58, 16, -- 35, 36, 37, 0, 0, 0, 18, 19, 0, 20, -- 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 202, 0, 12, 0, 0, 13, 0, 0, 22, -- 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 0, -- 0, 0, 32, 33, 0, 14, 15, 34, 16, 35, -- 36, 37, 0, 0, 0, 18, 19, 0, 20, 0, -- 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 204, 0, 12, 0, 0, 13, 0, 0, 22, 0, -- 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, -- 27, 28, 0, 0, 0, 29, 30, 31, 0, 0, -- 0, 32, 33, 0, 14, 15, 34, 16, 35, 36, -- 37, 0, 0, 0, 18, 19, 0, 20, 0, 21, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, -- 0, 12, 0, 0, 13, 0, 0, 22, 0, 0, -- 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, -- 28, 0, 0, 0, 29, 30, 31, 0, 0, 0, -- 32, 33, 0, 14, 15, 34, 16, 35, 36, 37, -- 0, 0, 0, 18, 19, 0, 20, 0, 21, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 202, 0, -- 292, 0, 0, 13, 0, 0, 22, 0, 0, 0, -- 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, -- 0, 0, 0, 29, 30, 31, 0, 0, 0, 32, -- 33, 0, 14, 15, 34, 16, 35, 36, 37, 0, -- 0, 0, 18, 19, 0, 20, 0, 21, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 204, 0, 292, -- 0, 0, 13, 0, 0, 22, 0, 0, 0, 0, -- 0, 0, 0, 23, 24, 25, 26, 27, 28, 0, -- 0, 0, 29, 30, 31, 0, 0, 0, 32, 33, -- 0, 14, 15, 34, 16, 35, 36, 37, 0, 0, -- 0, 18, 19, 0, 20, 0, 21, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 219, 0, 292, 0, -- 0, 13, 0, 0, 22, 0, 0, 0, 0, 0, -- 0, 0, 23, 24, 25, 26, 27, 28, 0, 0, -- 0, 29, 30, 31, 0, 0, 0, 32, 33, 0, -- 14, 15, 34, 16, 35, 36, 37, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 0, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 34, 137, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 0, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 266, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 273, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 311, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 313, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 346, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 347, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 350, 58, 0, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 359, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 0, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 111, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 119, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 57, 108, -- 0, 58, 0, 35, 36, 37, 0, 0, 0, 109, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 110, 0, 0, 112, 113, 114, 115, 116, 117, 118, -- 14, 15, 0, 16, 0, 0, 0, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 57, 108, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 109, 0, -- 0, 58, 0, 35, 36, 37, 0, 0, 0, 0, -- 0, 0, 112, 113, 114, 115, 116, 117, 118, 14, -- 15, 0, 16, 0, 0, 0, 0, 0, 0, 18, -- 19, 0, 20, 0, 21, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, -- 23, 24, 25, 26, 27, 28, 57, -32, 0, 29, -- 30, 31, 0, 0, 0, 32, 33, -32, 0, 0, -- 58, 0, 35, 36, 37, 0, 0, 0, 0, 0, -- 0, -32, -32, -32, -32, -32, -32, -32, 14, 15, -- 0, 16, 0, 0, 0, 0, 0, 0, 18, 19, -- 0, 20, 0, 21, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, -- 0, 22, 0, 0, 0, 0, 251, 0, 0, 23, -- 24, 25, 26, 27, 28, 0, 0, 110, 111, 30, -- 31, 0, 0, 0, 32, 33, 252, 14, 15, 58, -- 16, 35, 36, 37, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 22, 0, 0, 57, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 251, 253, 326, 29, 30, 31, -- 0, 0, 0, 32, 33, 110, 111, 0, 58, 0, -- 35, 36, 37, 0, 252, 14, 15, 0, 16, 0, -- 0, 0, 0, 0, 0, 18, 19, 0, 20, 0, -- 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 57, 0, 0, 0, 0, 0, 22, 0, -- 0, 0, 0, 251, 0, 0, 23, 24, 25, 26, -- 27, 28, 0, 253, 110, 29, 30, 31, 0, 0, -- 0, 32, 33, 252, 14, 15, 58, 16, 35, 36, -- 37, 0, 0, 0, 18, 19, 0, 20, 0, 21, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 12, 0, 0, 13, 142, 0, 22, 0, 0, -- 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, -- 28, 0, 0, 0, 29, 30, 31, 0, 0, 0, -- 32, 33, 0, 14, 15, 58, 16, 35, 36, 37, -- 0, 0, 0, 18, 19, 0, 20, 0, 21, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 12, 0, 0, 13, 150, 0, 22, 0, 0, 0, -- 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, -- 0, 0, 0, 29, 30, 31, 0, 0, 0, 32, -- 33, 0, 14, 15, 34, 16, 35, 36, 37, 0, -- 0, 0, 18, 19, 0, 20, 0, 21, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, -- 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, -- 251, 0, 0, 23, 24, 25, 26, 27, 28, 0, -- 0, 0, 29, 30, 31, 0, 0, 0, 32, 33, -- 252, 14, 15, 34, 16, 35, 36, 37, 0, 0, -- 0, 18, 19, 0, 20, 0, 21, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, -- 0, 13, 0, 0, 22, 0, 0, 0, 0, 0, -- 0, 0, 23, 24, 25, 26, 27, 28, 0, 0, -- 0, 29, 30, 31, 0, 0, 0, 32, 33, 0, -- 14, 15, 58, 16, 35, 36, 37, 0, 0, 0, -- 18, 19, 0, 20, 0, 21, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, -- 13, 0, 0, 22, 0, 0, 0, 0, 0, 0, -- 0, 23, 24, 25, 26, 27, 28, 0, 0, 0, -- 29, 30, 31, 0, 0, 0, 32, 33, 0, 14, -- 15, 34, 16, 35, 36, 37, 0, 0, 0, 18, -- 19, 0, 20, 0, 21, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 177, 0, 0, 13, -- 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, -- 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, -- 30, 31, 0, 0, 0, 32, 33, 0, 14, 15, -- 34, 16, 35, 36, 37, 0, 0, 0, 18, 19, -- 0, 20, 0, 21, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, -- 0, 22, 0, 0, 0, 0, 0, 0, 0, 23, -- 24, 25, 26, 27, 28, 0, 0, 0, 29, 30, -- 31, 0, 0, 0, 32, 33, 0, 14, 15, 34, -- 16, 35, 36, 37, 0, 0, 0, 18, 19, 0, -- 20, 0, 21, 0, 0, 0, 0, 0, 0, 0, -- 0, 208, 0, 0, 292, 0, 0, 13, 0, 0, -- 22, 0, 0, 0, 0, 0, 0, 0, 23, 24, -- 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, -- 0, 0, 0, 32, 33, 0, 14, 15, 58, 16, -- 35, 36, 37, 0, 0, 0, 18, 19, 0, 20, -- 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 57, 0, 0, 0, 0, 0, 22, -- 0, 0, 0, 0, -32, 0, 0, 23, 24, 25, -- 26, 27, 28, 0, 0, 0, 29, 30, 31, 0, -- 0, 0, 32, 33, -32, 14, 15, 34, 16, 35, -- 36, 37, 0, 0, 0, 18, 19, 0, 20, 0, -- 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 57, 0, 0, 0, 0, 0, 22, 0, -- 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, -- 27, 28, 0, 0, 0, 0, 30, 31, 0, 0, -- 0, 32, 33, 0, 14, 15, 58, 16, 35, 36, -- 37, 0, 0, 0, 18, 19, 0, 20, 0, 21, -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, -- 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, -- 28, 0, 0, 0, 29, 30, 31, 0, 0, 0, -- 32, 33, 0, 0, 0, 58, 0, 35, 36, 37 --}; -- --static const short yycheck[] = --{ -- 16, 81, 34, 177, 166, 10, 159, 68, 242, 84, -- 244, 18, 85, 29, 336, 88, 32, 33, 34, 35, -- 36, 37, 66, 67, 5, 10, 42, 68, 9, 10, -- 41, 9, 178, 44, 0, 357, 43, 53, 51, 52, -- 11, 19, 58, 118, 97, 9, 107, 108, 18, 109, -- 103, 44, 68, 12, 83, 19, 12, 86, 39, 44, -- 89, 90, 9, 123, 93, 10, 107, 108, 100, 16, -- 9, 9, 101, 15, 85, 86, 87, 16, 16, 159, -- 85, 134, 135, 99, 100, 98, 107, 108, 322, 133, -- 9, 166, 85, 106, 87, 178, 13, 16, 109, 44, -- 85, 86, 87, 9, 12, 11, 41, 9, 124, 125, -- 126, 127, 128, 129, 16, 349, 10, 12, 292, 36, -- 14, 174, 39, 176, 109, 12, 107, 361, 144, 145, -- 283, 147, 148, 12, 187, 164, 189, 153, 154, 155, -- 85, 170, 87, 12, 12, 15, 221, 293, 164, 9, -- 296, 297, 298, 299, 170, 91, 16, 303, 9, 234, -- 102, 103, 178, 9, 106, 16, 106, 320, 228, 229, -- 16, 12, 10, 12, 336, 191, 192, 252, 194, 195, -- 196, 197, 198, 199, 10, 201, 10, 203, 14, 205, -- 206, 251, 208, 237, 247, 357, 342, 350, 10, 215, -- 43, 10, 14, 283, 220, 14, 222, 188, 12, 284, -- 293, 12, 94, 296, 297, 298, 299, 15, 85, 251, -- 303, 253, 254, 255, 10, 257, 242, 18, 244, 261, -- 100, 101, 102, 103, 78, 251, 106, 253, 254, 255, -- 320, 257, 258, 259, 260, 261, 9, 14, 10, 324, -- 263, 304, 10, 53, 54, 16, 272, 16, 318, 342, -- 276, 98, 278, 251, 280, 253, 254, 255, 43, 257, -- 350, 12, 16, 261, 16, 41, 16, 293, 16, 107, -- 296, 297, 298, 299, 105, 16, -1, 303, -1, 305, -- 306, 307, 345, -1, 326, -1, -1, -1, 351, 44, -- -1, 32, 33, 34, -1, -1, 37, 360, -1, -1, -- 326, 42, 365, 329, -1, 331, -1, 333, 334, 332, -- -1, 337, 53, -1, -1, -1, 342, 58, -1, 310, -- 359, -1, -1, -1, -1, -1, 352, 68, 326, -1, -- 85, 86, 87, -1, -1, -1, -1, 147, 148, -1, -- -1, -1, -1, -1, 154, 155, -1, -1, -1, -1, -- -1, -1, -1, -1, 109, -1, -1, -1, 99, 100, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 179, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 124, 125, 126, 127, 128, 129, -1, -- -1, -1, -1, -1, -1, -1, 206, 207, -1, -1, -- -1, -1, -1, 144, 145, -1, 147, 148, -1, -1, -- -1, -1, 153, 154, 155, -1, -1, 227, -1, -1, -- -1, -1, -1, 164, -1, -1, -1, -1, -1, 170, -- -1, -1, -1, -1, -1, -1, -1, 178, -1, -1, -- 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 192, -1, 194, 195, 196, 197, 198, 199, -1, -- 201, -1, 203, -1, 205, 206, -1, 208, -1, -1, -- 280, 281, -1, -1, 215, -1, -1, -1, -1, 220, -- -1, 222, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, 306, 307, -1, -1, -- -1, 242, -1, 244, -1, -1, -1, -1, -1, -1, -- 251, -1, 253, 254, 255, 325, 257, 258, 259, 260, -- 261, 5, -1, -1, -1, -1, -1, -1, 12, -1, -- -1, 272, -1, -1, -1, 276, -1, 278, -1, 280, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 293, -1, -1, 296, 297, 298, 299, -1, -- -1, -1, 303, -1, 305, 306, 307, -1, -1, -1, -- -1, -1, 56, 57, -1, -1, -1, -1, -1, -1, -- 64, 65, 66, 67, -1, 326, 70, 71, -1, -1, -- -1, -1, 333, 334, -1, -1, 337, -1, -1, -1, -- -1, 342, 86, -1, -1, -1, -1, -1, -1, 93, -- -1, 352, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 105, -1, 107, -1, 109, -1, -1, 112, 113, -- 114, 115, 116, 117, -1, 119, 120, 121, -1, 123, -- -1, -1, -1, -1, -1, -1, 130, -1, -1, 133, -- -1, -1, -1, -1, 138, -1, 140, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 0, 1, -1, -1, -1, -1, -1, 7, 8, -1, -- 10, 11, 12, 167, 14, 15, -1, -1, 172, -1, -- -1, -1, -1, 177, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, 44, 45, -1, 47, -1, -1, -- -1, -1, -1, 53, 54, 55, -1, 57, -1, 59, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 225, -1, -1, 228, 229, -1, 77, -1, 233, -- -1, -1, -1, 237, -1, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, -1, -1, -1, -- 100, 101, -1, -1, -1, 105, -1, 107, 108, 109, -- -1, -1, 266, 267, 268, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 1, -1, -1, -1, -1, 292, -1, -- -1, -1, 10, 11, 12, -1, 14, 15, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 316, -1, 318, -1, -1, 321, -1, -1, -- -1, -1, -1, -1, -1, -1, 44, 45, 46, 47, -- 48, 49, 50, 51, 52, 339, 54, 55, 56, 57, -- -1, 59, 60, 61, -1, -1, -1, -1, -1, -1, -- 1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -- 11, 12, -1, 14, 15, -1, 17, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, 97, -- 98, -1, 100, 101, -1, -1, -1, 105, -1, 107, -- 108, 109, -1, 44, 45, 46, 47, 48, 49, 50, -- 51, 52, -1, 54, 55, 56, 57, -1, 59, 60, -- 61, -1, -1, -1, -1, -1, -1, 1, -1, -1, -- -1, -1, -1, -1, 75, 76, 77, 11, 12, -1, -- 14, 15, -1, 17, 85, 86, 87, 88, 89, 90, -- -1, -1, -1, 94, 95, 96, 97, 98, -1, 100, -- 101, -1, -1, -1, 105, -1, 107, 108, 109, -1, -- 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -- 54, 55, 56, 57, -1, 59, 60, 61, -1, -1, -- -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -- -1, 75, 76, 77, 11, 12, -1, 14, 15, -1, -- 17, 85, 86, 87, 88, 89, 90, -1, -1, -1, -- 94, 95, 96, 97, 98, -1, 100, 101, -1, -1, -- -1, 105, -1, 107, 108, 109, -1, 44, 45, 46, -- 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, -- 57, -1, 59, 60, 61, -1, -1, -1, -1, -1, -- -1, 1, -1, -1, -1, -1, -1, -1, 75, 76, -- 77, 11, 12, -1, 14, 15, -1, 17, 85, 86, -- 87, 88, 89, 90, -1, -1, -1, 94, 95, 96, -- 97, 98, -1, 100, 101, -1, -1, -1, 105, -1, -- 107, 108, 109, -1, 44, 45, 46, 47, 48, 49, -- 50, 51, 52, -1, 54, 55, 56, 57, -1, 59, -- 60, 61, -1, -1, -1, -1, -1, -1, 1, -1, -- -1, -1, -1, -1, -1, 75, 76, 77, 11, 12, -- -1, 14, 15, -1, 17, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, 97, 98, -1, -- 100, 101, -1, -1, -1, 105, -1, 107, 108, 109, -- -1, 44, 45, 46, 47, 48, 49, 50, 51, 52, -- -1, 54, 55, 56, 57, -1, 59, 60, 61, -1, -- -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -- -1, -1, 75, 76, 77, 10, 11, 12, -1, 14, -- 15, -1, 85, 86, 87, 88, 89, 90, -1, -1, -- -1, 94, 95, 96, 97, 98, -1, 100, 101, -1, -- -1, -1, 105, -1, 107, 108, 109, -1, -1, 44, -- 45, 46, 47, 48, 49, 50, 51, 52, -1, 54, -- 55, 56, 57, -1, 59, 60, 61, -1, -1, -1, -- -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -- 75, 76, 77, 11, 12, -1, 14, 15, -1, 17, -- 85, 86, 87, 88, 89, 90, -1, -1, -1, 94, -- 95, 96, 97, 98, -1, 100, 101, -1, -1, -1, -- 105, -1, 107, 108, 109, -1, 44, 45, 46, 47, -- 48, 49, 50, 51, 52, -1, 54, 55, 56, 57, -- -1, 59, 60, 61, -1, -1, -1, -1, -1, -1, -- 1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -- 11, 12, -1, 14, 15, -1, 17, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, 97, -- 98, -1, 100, 101, -1, -1, -1, 105, -1, 107, -- 108, 109, -1, 44, 45, 46, 47, 48, 49, 50, -- 51, 52, -1, 54, 55, 56, 57, -1, 59, 60, -- 61, -1, -1, -1, -1, -1, -1, 1, -1, -1, -- -1, -1, -1, -1, 75, 76, 77, 11, 12, -1, -- 14, 15, -1, -1, 85, 86, 87, 88, 89, 90, -- -1, -1, -1, 94, 95, 96, 97, 98, -1, 100, -- 101, -1, -1, -1, 105, -1, 107, 108, 109, -1, -- 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -- 54, 55, 56, 57, -1, 59, 60, 61, -1, -1, -- -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -- -1, 75, 76, 77, 12, -1, 14, 15, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, -1, -1, -- 94, 95, 96, 97, 98, -1, 100, 101, -1, -1, -- -1, 105, -1, 107, 108, 109, 44, 45, -1, 47, -- -1, 49, -1, -1, -1, -1, 54, 55, -1, 57, -- -1, 59, -1, -1, -1, -1, -1, -1, -1, 1, -- -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, -- 12, -1, -1, 15, 16, -1, -1, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, -1, -- 7, 8, 100, 101, 11, 12, -1, 105, 15, 107, -- 108, 109, 44, 45, -1, 47, -1, 49, -1, -1, -- -1, -1, 54, 55, -1, 57, -1, 59, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -- 47, -1, -1, 75, 76, 77, 53, 54, 55, -1, -- 57, -1, 59, 85, 86, 87, 88, 89, 90, -1, -- -1, -1, 94, 95, 96, -1, -1, -1, 100, 101, -- 77, -1, -1, 105, -1, 107, 108, 109, 85, 86, -- 87, 88, 89, 90, -1, -1, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, 16, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, 16, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, 16, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, 16, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, 9, 100, 101, 12, 13, -1, 105, -1, -- 107, 108, 109, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, -1, 100, 101, -1, -1, -1, 105, -1, -- 107, 108, 109, 10, -1, 12, 13, 14, -1, -1, -- -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 34, 35, -1, -- 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -- 47, -1, -1, -1, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 10, -1, 12, -1, 14, 15, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, 92, -1, 94, 95, 96, -- -1, -1, -1, 100, 101, -1, 44, 45, 105, 47, -- 107, 108, 109, -1, -1, -1, 54, 55, -1, 57, -- -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 10, -1, 12, -1, -1, 15, -1, -1, 77, -- -1, -1, -1, -1, -1, -1, -1, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, -1, -- -1, -1, 100, 101, -1, 44, 45, 105, 47, 107, -- 108, 109, -1, -1, -1, 54, 55, -1, 57, -1, -- 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 10, -1, 12, -1, -1, 15, -1, -1, 77, -1, -- -1, -1, -1, -1, -1, -1, 85, 86, 87, 88, -- 89, 90, -1, -1, -1, 94, 95, 96, -1, -1, -- -1, 100, 101, -1, 44, 45, 105, 47, 107, 108, -- 109, -1, -1, -1, 54, 55, -1, 57, -1, 59, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, -- -1, 12, -1, -1, 15, -1, -1, 77, -1, -1, -- -1, -1, -1, -1, -1, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, -1, -1, -1, -- 100, 101, -1, 44, 45, 105, 47, 107, 108, 109, -- -1, -1, -1, 54, 55, -1, 57, -1, 59, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, 10, -1, -- 12, -1, -1, 15, -1, -1, 77, -1, -1, -1, -- -1, -1, -1, -1, 85, 86, 87, 88, 89, 90, -- -1, -1, -1, 94, 95, 96, -1, -1, -1, 100, -- 101, -1, 44, 45, 105, 47, 107, 108, 109, -1, -- -1, -1, 54, 55, -1, 57, -1, 59, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 10, -1, 12, -- -1, -1, 15, -1, -1, 77, -1, -1, -1, -1, -- -1, -1, -1, 85, 86, 87, 88, 89, 90, -1, -- -1, -1, 94, 95, 96, -1, -1, -1, 100, 101, -- -1, 44, 45, 105, 47, 107, 108, 109, -1, -1, -- -1, 54, 55, -1, 57, -1, 59, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, 10, -1, 12, -1, -- -1, 15, -1, -1, 77, -1, -1, -1, -1, -1, -- -1, -1, 85, 86, 87, 88, 89, 90, -1, -1, -- -1, 94, 95, 96, -1, -1, -1, 100, 101, -1, -- 44, 45, 105, 47, 107, 108, 109, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, -1, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, -1, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, 93, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- 14, 105, -1, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, 16, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, -1, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, 92, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 12, 13, -- -1, 105, -1, 107, 108, 109, -1, -1, -1, 23, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 34, -1, -1, 37, 38, 39, 40, 41, 42, 43, -- 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, 12, 13, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, 23, -1, -- -1, 105, -1, 107, 108, 109, -1, -1, -1, -1, -- -1, -1, 37, 38, 39, 40, 41, 42, 43, 44, -- 45, -1, 47, -1, -1, -1, -1, -1, -1, 54, -- 55, -1, 57, -1, 59, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 77, -1, -1, -1, -1, -1, -1, -1, -- 85, 86, 87, 88, 89, 90, 12, 13, -1, 94, -- 95, 96, -1, -1, -1, 100, 101, 23, -1, -1, -- 105, -1, 107, 108, 109, -1, -1, -1, -1, -1, -- -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, -- -1, 47, -1, -1, -1, -1, -1, -1, 54, 55, -- -1, 57, -1, 59, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -- -1, 77, -1, -1, -1, -1, 23, -1, -1, 85, -- 86, 87, 88, 89, 90, -1, -1, 34, 35, 95, -- 96, -1, -1, -1, 100, 101, 43, 44, 45, 105, -- 47, 107, 108, 109, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 77, -1, -1, 12, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, 23, 92, 93, 94, 95, 96, -- -1, -1, -1, 100, 101, 34, 35, -1, 105, -1, -- 107, 108, 109, -1, 43, 44, 45, -1, 47, -1, -- -1, -1, -1, -1, -1, 54, 55, -1, 57, -1, -- 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 12, -1, -1, -1, -1, -1, 77, -1, -- -1, -1, -1, 23, -1, -1, 85, 86, 87, 88, -- 89, 90, -1, 92, 34, 94, 95, 96, -1, -1, -- -1, 100, 101, 43, 44, 45, 105, 47, 107, 108, -- 109, -1, -1, -1, 54, 55, -1, 57, -1, 59, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, 12, -1, -1, 15, 16, -1, 77, -1, -1, -- -1, -1, -1, -1, -1, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, -1, -1, -1, -- 100, 101, -1, 44, 45, 105, 47, 107, 108, 109, -- -1, -1, -1, 54, 55, -1, 57, -1, 59, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 12, -1, -1, 15, 16, -1, 77, -1, -1, -1, -- -1, -1, -1, -1, 85, 86, 87, 88, 89, 90, -- -1, -1, -1, 94, 95, 96, -1, -1, -1, 100, -- 101, -1, 44, 45, 105, 47, 107, 108, 109, -1, -- -1, -1, 54, 55, -1, 57, -1, 59, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, -- -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, -- 23, -1, -1, 85, 86, 87, 88, 89, 90, -1, -- -1, -1, 94, 95, 96, -1, -1, -1, 100, 101, -- 43, 44, 45, 105, 47, 107, 108, 109, -1, -1, -- -1, 54, 55, -1, 57, -1, 59, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, -1, 12, -1, -- -1, 15, -1, -1, 77, -1, -1, -1, -1, -1, -- -1, -1, 85, 86, 87, 88, 89, 90, -1, -1, -- -1, 94, 95, 96, -1, -1, -1, 100, 101, -1, -- 44, 45, 105, 47, 107, 108, 109, -1, -1, -1, -- 54, 55, -1, 57, -1, 59, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 12, -1, -1, -- 15, -1, -1, 77, -1, -1, -1, -1, -1, -1, -- -1, 85, 86, 87, 88, 89, 90, -1, -1, -1, -- 94, 95, 96, -1, -1, -1, 100, 101, -1, 44, -- 45, 105, 47, 107, 108, 109, -1, -1, -1, 54, -- 55, -1, 57, -1, 59, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, 12, -1, -1, 15, -- -1, -1, 77, -1, -1, -1, -1, -1, -1, -1, -- 85, 86, 87, 88, 89, 90, -1, -1, -1, 94, -- 95, 96, -1, -1, -1, 100, 101, -1, 44, 45, -- 105, 47, 107, 108, 109, -1, -1, -1, 54, 55, -- -1, 57, -1, 59, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, 12, -1, -1, -1, -1, -- -1, 77, -1, -1, -1, -1, -1, -1, -1, 85, -- 86, 87, 88, 89, 90, -1, -1, -1, 94, 95, -- 96, -1, -1, -1, 100, 101, -1, 44, 45, 105, -- 47, 107, 108, 109, -1, -1, -1, 54, 55, -1, -- 57, -1, 59, -1, -1, -1, -1, -1, -1, -1, -- -1, 68, -1, -1, 12, -1, -1, 15, -1, -1, -- 77, -1, -1, -1, -1, -1, -1, -1, 85, 86, -- 87, 88, 89, 90, -1, -1, -1, 94, 95, 96, -- -1, -1, -1, 100, 101, -1, 44, 45, 105, 47, -- 107, 108, 109, -1, -1, -1, 54, 55, -1, 57, -- -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, 12, -1, -1, -1, -1, -1, 77, -- -1, -1, -1, -1, 23, -1, -1, 85, 86, 87, -- 88, 89, 90, -1, -1, -1, 94, 95, 96, -1, -- -1, -1, 100, 101, 43, 44, 45, 105, 47, 107, -- 108, 109, -1, -1, -1, 54, 55, -1, 57, -1, -- 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, 12, -1, -1, -1, -1, -1, 77, -1, -- -1, -1, -1, -1, -1, -1, 85, 86, 87, 88, -- 89, 90, -1, -1, -1, -1, 95, 96, -1, -1, -- -1, 100, 101, -1, 44, 45, 105, 47, 107, 108, -- 109, -1, -1, -1, 54, 55, -1, 57, -1, 59, -- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, -- -1, -1, -1, -1, -1, 85, 86, 87, 88, 89, -- 90, -1, -1, -1, 94, 95, 96, -1, -1, -1, -- 100, 101, -1, -1, -1, 105, -1, 107, 108, 109 --}; -- --/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing -- symbol of state STATE-NUM. */ --static const unsigned char yystos[] = --{ -- 0, 1, 10, 14, 112, 127, 129, 141, 0, 7, -- 8, 11, 12, 15, 44, 45, 47, 53, 54, 55, -- 57, 59, 77, 85, 86, 87, 88, 89, 90, 94, -- 95, 96, 100, 101, 105, 107, 108, 109, 124, 130, -- 131, 133, 136, 143, 144, 154, 155, 156, 158, 10, -- 14, 124, 124, 136, 137, 145, 12, 12, 105, 155, -- 156, 85, 88, 122, 12, 12, 12, 12, 41, 156, -- 12, 12, 155, 155, 143, 155, 156, 156, 155, 1, -- 10, 14, 46, 48, 49, 50, 51, 52, 56, 60, -- 61, 75, 76, 97, 98, 116, 118, 123, 124, 136, -- 140, 147, 149, 153, 159, 9, 124, 127, 13, 23, -- 34, 35, 37, 38, 39, 40, 41, 42, 43, 92, -- 113, 114, 155, 12, 15, 100, 101, 102, 103, 106, -- 68, 107, 108, 18, 153, 153, 9, 16, 115, 16, -- 115, 91, 16, 134, 136, 136, 12, 136, 136, 134, -- 16, 134, 155, 41, 136, 136, 10, 125, 126, 14, -- 125, 148, 148, 158, 136, 148, 12, 12, 148, 148, -- 136, 148, 12, 10, 150, 149, 153, 12, 135, 138, -- 139, 143, 155, 156, 148, 17, 149, 152, 130, 153, -- 131, 94, 136, 144, 136, 136, 136, 136, 136, 136, -- 158, 136, 10, 136, 10, 136, 136, 144, 68, 155, -- 155, 155, 155, 155, 155, 136, 134, 17, 17, 10, -- 136, 43, 136, 15, 16, 115, 85, 157, 115, 115, -- 16, 16, 155, 115, 115, 10, 126, 18, 148, 128, -- 147, 158, 136, 148, 136, 149, 78, 117, 17, 142, -- 137, 23, 43, 92, 113, 114, 155, 115, 13, 36, -- 39, 68, 149, 124, 17, 156, 93, 115, 115, 155, -- 19, 158, 136, 16, 115, 146, 136, 144, 136, 144, -- 136, 158, 134, 14, 43, 146, 146, 151, 10, 149, -- 10, 16, 12, 135, 144, 158, 135, 135, 135, 135, -- 155, 155, 155, 135, 153, 136, 136, 136, 85, 10, -- 132, 16, 16, 16, 16, 16, 115, 16, 115, 19, -- 14, 126, 158, 98, 43, 137, 93, 17, 16, 115, -- 16, 115, 124, 136, 136, 144, 126, 136, 146, 12, -- 158, 16, 135, 156, 156, 153, 16, 16, 16, 128, -- 14, 121, 136, 16, 16, 17, 146, 126, 149, 16, -- 120, 128, 148, 149, 146, 119, 149 --}; -- --#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) --# define YYSIZE_T __SIZE_TYPE__ --#endif --#if ! defined (YYSIZE_T) && defined (size_t) --# define YYSIZE_T size_t --#endif --#if ! defined (YYSIZE_T) --# if defined (__STDC__) || defined (__cplusplus) --# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ --# define YYSIZE_T size_t --# endif --#endif --#if ! defined (YYSIZE_T) --# define YYSIZE_T unsigned int --#endif -- --#define yyerrok (yyerrstatus = 0) --#define yyclearin (yychar = YYEMPTY) --#define YYEMPTY (-2) --#define YYEOF 0 -- --#define YYACCEPT goto yyacceptlab --#define YYABORT goto yyabortlab --#define YYERROR goto yyerrlab1 -- --/* Like YYERROR except do call yyerror. This remains here temporarily -- to ease the transition to the new meaning of YYERROR, for GCC. -- Once GCC version 2 has supplanted version 1, this can go. */ -- --#define YYFAIL goto yyerrlab -- --#define YYRECOVERING() (!!yyerrstatus) -- --#define YYBACKUP(Token, Value) \ --do \ -- if (yychar == YYEMPTY && yylen == 1) \ -- { \ -- yychar = (Token); \ -- yylval = (Value); \ -- yytoken = YYTRANSLATE (yychar); \ -- YYPOPSTACK; \ -- goto yybackup; \ -- } \ -- else \ -- { \ -- yyerror ("syntax error: cannot back up");\ -- YYERROR; \ -- } \ --while (0) -- --#define YYTERROR 1 --#define YYERRCODE 256 -- --/* YYLLOC_DEFAULT -- Compute the default location (before the actions -- are run). */ -- --#ifndef YYLLOC_DEFAULT --# define YYLLOC_DEFAULT(Current, Rhs, N) \ -- Current.first_line = Rhs[1].first_line; \ -- Current.first_column = Rhs[1].first_column; \ -- Current.last_line = Rhs[N].last_line; \ -- Current.last_column = Rhs[N].last_column; --#endif -- --/* YYLEX -- calling `yylex' with the right arguments. */ -- --#ifdef YYLEX_PARAM --# define YYLEX yylex (YYLEX_PARAM) --#else --# define YYLEX yylex () --#endif -- --/* Enable debugging if requested. */ --#if YYDEBUG -- --# ifndef YYFPRINTF --# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ --# define YYFPRINTF fprintf --# endif -- --# define YYDPRINTF(Args) \ --do { \ -- if (yydebug) \ -- YYFPRINTF Args; \ --} while (0) -- --# define YYDSYMPRINT(Args) \ --do { \ -- if (yydebug) \ -- yysymprint Args; \ --} while (0) -- --# define YYDSYMPRINTF(Title, Token, Value, Location) \ --do { \ -- if (yydebug) \ -- { \ -- YYFPRINTF (stderr, "%s ", Title); \ -- yysymprint (stderr, \ -- Token, Value); \ -- YYFPRINTF (stderr, "\n"); \ -- } \ --} while (0) -- --/*------------------------------------------------------------------. --| yy_stack_print -- Print the state stack from its BOTTOM up to its | --| TOP (cinluded). | --`------------------------------------------------------------------*/ -- --#if defined (__STDC__) || defined (__cplusplus) --static void --yy_stack_print (short *bottom, short *top) --#else --static void --yy_stack_print (bottom, top) -- short *bottom; -- short *top; --#endif --{ -- YYFPRINTF (stderr, "Stack now"); -- for (/* Nothing. */; bottom <= top; ++bottom) -- YYFPRINTF (stderr, " %d", *bottom); -- YYFPRINTF (stderr, "\n"); --} -- --# define YY_STACK_PRINT(Bottom, Top) \ --do { \ -- if (yydebug) \ -- yy_stack_print ((Bottom), (Top)); \ --} while (0) -- -- --/*------------------------------------------------. --| Report that the YYRULE is going to be reduced. | --`------------------------------------------------*/ -- --#if defined (__STDC__) || defined (__cplusplus) --static void --yy_reduce_print (int yyrule) --#else --static void --yy_reduce_print (yyrule) -- int yyrule; --#endif --{ -- int yyi; -- unsigned int yylineno = yyrline[yyrule]; -- YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", -- yyrule - 1, yylineno); -- /* Print the symbols being reduced, and their result. */ -- for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) -- YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); -- YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); --} -- --# define YY_REDUCE_PRINT(Rule) \ --do { \ -- if (yydebug) \ -- yy_reduce_print (Rule); \ --} while (0) -- --/* Nonzero means print parse trace. It is left uninitialized so that -- multiple parsers can coexist. */ --int yydebug; --#else /* !YYDEBUG */ --# define YYDPRINTF(Args) --# define YYDSYMPRINT(Args) --# define YYDSYMPRINTF(Title, Token, Value, Location) --# define YY_STACK_PRINT(Bottom, Top) --# define YY_REDUCE_PRINT(Rule) --#endif /* !YYDEBUG */ -- -- --/* YYINITDEPTH -- initial size of the parser's stacks. */ --#ifndef YYINITDEPTH --# define YYINITDEPTH 200 --#endif -- --/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only -- if the built-in stack extension method is used). -- -- Do not make this value too large; the results are undefined if -- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) -- evaluated with infinite-precision integer arithmetic. */ -- --#if YYMAXDEPTH == 0 --# undef YYMAXDEPTH --#endif -- --#ifndef YYMAXDEPTH --# define YYMAXDEPTH 10000 --#endif -- -- -- --#if YYERROR_VERBOSE -- --# ifndef yystrlen --# if defined (__GLIBC__) && defined (_STRING_H) --# define yystrlen strlen --# else --/* Return the length of YYSTR. */ --static YYSIZE_T --# if defined (__STDC__) || defined (__cplusplus) --yystrlen (const char *yystr) --# else --yystrlen (yystr) -- const char *yystr; --# endif --{ -- register const char *yys = yystr; -- -- while (*yys++ != '\0') -- continue; -- -- return yys - yystr - 1; --} --# endif --# endif -- --# ifndef yystpcpy --# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) --# define yystpcpy stpcpy --# else --/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in -- YYDEST. */ --static char * --# if defined (__STDC__) || defined (__cplusplus) --yystpcpy (char *yydest, const char *yysrc) --# else --yystpcpy (yydest, yysrc) -- char *yydest; -- const char *yysrc; --# endif --{ -- register char *yyd = yydest; -- register const char *yys = yysrc; -- -- while ((*yyd++ = *yys++) != '\0') -- continue; -- -- return yyd - 1; --} --# endif --# endif -- --#endif /* !YYERROR_VERBOSE */ -- -- -- --#if YYDEBUG --/*--------------------------------. --| Print this symbol on YYOUTPUT. | --`--------------------------------*/ -- --#if defined (__STDC__) || defined (__cplusplus) --static void --yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) --#else --static void --yysymprint (yyoutput, yytype, yyvaluep) -- FILE *yyoutput; -- int yytype; -- YYSTYPE *yyvaluep; --#endif --{ -- /* Pacify ``unused variable'' warnings. */ -- (void) yyvaluep; -- -- if (yytype < YYNTOKENS) -- { -- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); --# ifdef YYPRINT -- YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); --# endif -- } -- else -- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); -- -- switch (yytype) -- { -- default: -- break; -- } -- YYFPRINTF (yyoutput, ")"); --} -- --#endif /* ! YYDEBUG */ --/*-----------------------------------------------. --| Release the memory associated to this symbol. | --`-----------------------------------------------*/ -- --#if defined (__STDC__) || defined (__cplusplus) --static void --yydestruct (int yytype, YYSTYPE *yyvaluep) --#else --static void --yydestruct (yytype, yyvaluep) -- int yytype; -- YYSTYPE *yyvaluep; --#endif --{ -- /* Pacify ``unused variable'' warnings. */ -- (void) yyvaluep; -- -- switch (yytype) -- { -- -- default: -- break; -- } --} -- -- --/* Prevent warnings from -Wmissing-prototypes. */ -- --#ifdef YYPARSE_PARAM --# if defined (__STDC__) || defined (__cplusplus) --int yyparse (void *YYPARSE_PARAM); --# else --int yyparse (); --# endif --#else /* ! YYPARSE_PARAM */ --#if defined (__STDC__) || defined (__cplusplus) --int yyparse (void); --#else --int yyparse (); --#endif --#endif /* ! YYPARSE_PARAM */ -- -- -- --/* The lookahead symbol. */ --int yychar; -- --/* The semantic value of the lookahead symbol. */ --YYSTYPE yylval; -- --/* Number of syntax errors so far. */ --int yynerrs; -- -- -- --/*----------. --| yyparse. | --`----------*/ -- --#ifdef YYPARSE_PARAM --# if defined (__STDC__) || defined (__cplusplus) --int yyparse (void *YYPARSE_PARAM) --# else --int yyparse (YYPARSE_PARAM) -- void *YYPARSE_PARAM; --# endif --#else /* ! YYPARSE_PARAM */ --#if defined (__STDC__) || defined (__cplusplus) --int --yyparse (void) --#else --int --yyparse () -- --#endif --#endif --{ -- -- register int yystate; -- register int yyn; -- int yyresult; -- /* Number of tokens to shift before error messages enabled. */ -- int yyerrstatus; -- /* Lookahead token as an internal (translated) token number. */ -- int yytoken = 0; -- -- /* Three stacks and their tools: -- `yyss': related to states, -- `yyvs': related to semantic values, -- `yyls': related to locations. -- -- Refer to the stacks thru separate pointers, to allow yyoverflow -- to reallocate them elsewhere. */ -- -- /* The state stack. */ -- short yyssa[YYINITDEPTH]; -- short *yyss = yyssa; -- register short *yyssp; -- -- /* The semantic value stack. */ -- YYSTYPE yyvsa[YYINITDEPTH]; -- YYSTYPE *yyvs = yyvsa; -- register YYSTYPE *yyvsp; -- -- -- --#define YYPOPSTACK (yyvsp--, yyssp--) -- -- YYSIZE_T yystacksize = YYINITDEPTH; -- -- /* The variables used to return semantic value and location from the -- action routines. */ -- YYSTYPE yyval; -- -- -- /* When reducing, the number of symbols on the RHS of the reduced -- rule. */ -- int yylen; -- -- YYDPRINTF ((stderr, "Starting parse\n")); -- -- yystate = 0; -- yyerrstatus = 0; -- yynerrs = 0; -- yychar = YYEMPTY; /* Cause a token to be read. */ -- -- /* Initialize stack pointers. -- Waste one element of value and location stack -- so that they stay on the same level as the state stack. -- The wasted elements are never initialized. */ -- -- yyssp = yyss; -- yyvsp = yyvs; -- -- goto yysetstate; -- --/*------------------------------------------------------------. --| yynewstate -- Push a new state, which is found in yystate. | --`------------------------------------------------------------*/ -- yynewstate: -- /* In all cases, when you get here, the value and location stacks -- have just been pushed. so pushing a state here evens the stacks. -- */ -- yyssp++; -- -- yysetstate: -- *yyssp = yystate; -- -- if (yyss + yystacksize - 1 <= yyssp) -- { -- /* Get the current used size of the three stacks, in elements. */ -- YYSIZE_T yysize = yyssp - yyss + 1; -- --#ifdef yyoverflow -- { -- /* Give user a chance to reallocate the stack. Use copies of -- these so that the &'s don't force the real ones into -- memory. */ -- YYSTYPE *yyvs1 = yyvs; -- short *yyss1 = yyss; -- -- -- /* Each stack pointer address is followed by the size of the -- data in use in that stack, in bytes. This used to be a -- conditional around just the two extra args, but that might -- be undefined if yyoverflow is a macro. */ -- yyoverflow ("parser stack overflow", -- &yyss1, yysize * sizeof (*yyssp), -- &yyvs1, yysize * sizeof (*yyvsp), -- -- &yystacksize); -- -- yyss = yyss1; -- yyvs = yyvs1; -- } --#else /* no yyoverflow */ --# ifndef YYSTACK_RELOCATE -- goto yyoverflowlab; --# else -- /* Extend the stack our own way. */ -- if (YYMAXDEPTH <= yystacksize) -- goto yyoverflowlab; -- yystacksize *= 2; -- if (YYMAXDEPTH < yystacksize) -- yystacksize = YYMAXDEPTH; -- -- { -- short *yyss1 = yyss; -- union yyalloc *yyptr = -- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); -- if (! yyptr) -- goto yyoverflowlab; -- YYSTACK_RELOCATE (yyss); -- YYSTACK_RELOCATE (yyvs); -- --# undef YYSTACK_RELOCATE -- if (yyss1 != yyssa) -- YYSTACK_FREE (yyss1); -- } --# endif --#endif /* no yyoverflow */ -- -- yyssp = yyss + yysize - 1; -- yyvsp = yyvs + yysize - 1; -- -- -- YYDPRINTF ((stderr, "Stack size increased to %lu\n", -- (unsigned long int) yystacksize)); -- -- if (yyss + yystacksize - 1 <= yyssp) -- YYABORT; -- } -- -- YYDPRINTF ((stderr, "Entering state %d\n", yystate)); -- -- goto yybackup; -- --/*-----------. --| yybackup. | --`-----------*/ --yybackup: -- --/* Do appropriate processing given the current state. */ --/* Read a lookahead token if we need one and don't already have one. */ --/* yyresume: */ -- -- /* First try to decide what to do without reference to lookahead token. */ -- -- yyn = yypact[yystate]; -- if (yyn == YYPACT_NINF) -- goto yydefault; -- -- /* Not known => get a lookahead token if don't already have one. */ -- -- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ -- if (yychar == YYEMPTY) -- { -- YYDPRINTF ((stderr, "Reading a token: ")); -- yychar = YYLEX; -- } -- -- if (yychar <= YYEOF) -- { -- yychar = yytoken = YYEOF; -- YYDPRINTF ((stderr, "Now at end of input.\n")); -- } -- else -- { -- yytoken = YYTRANSLATE (yychar); -- YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); -- } -- -- /* If the proper action on seeing token YYTOKEN is to reduce or to -- detect an error, take that action. */ -- yyn += yytoken; -- if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) -- goto yydefault; -- yyn = yytable[yyn]; -- if (yyn <= 0) -- { -- if (yyn == 0 || yyn == YYTABLE_NINF) -- goto yyerrlab; -- yyn = -yyn; -- goto yyreduce; -- } -- -- if (yyn == YYFINAL) -- YYACCEPT; -- -- /* Shift the lookahead token. */ -- YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); -- -- /* Discard the token being shifted unless it is eof. */ -- if (yychar != YYEOF) -- yychar = YYEMPTY; -- -- *++yyvsp = yylval; -- -- -- /* Count tokens shifted since error; after three, turn off error -- status. */ -- if (yyerrstatus) -- yyerrstatus--; -- -- yystate = yyn; -- goto yynewstate; -- -- --/*-----------------------------------------------------------. --| yydefault -- do the default action for the current state. | --`-----------------------------------------------------------*/ --yydefault: -- yyn = yydefact[yystate]; -- if (yyn == 0) -- goto yyerrlab; -- goto yyreduce; -- -- --/*-----------------------------. --| yyreduce -- Do a reduction. | --`-----------------------------*/ --yyreduce: -- /* yyn is the number of a rule to reduce with. */ -- yylen = yyr2[yyn]; -- -- /* If YYLEN is nonzero, implement the default value of the action: -- `$$ = $1'. -- -- Otherwise, the following line sets YYVAL to garbage. -- This behavior is undocumented and Bison -- users should not rely upon it. Assigning to YYVAL -- unconditionally makes the parser a bit smaller, and it avoids a -- GCC warning that YYVAL may be used uninitialized. */ -- yyval = yyvsp[1-yylen]; -- -- -- YY_REDUCE_PRINT (yyn); -- switch (yyn) -- { -- case 2: --#line 98 "awkgram.y" -- { if (errorflag==0) -- winner = (Node *)stat3(PROGRAM, beginloc, yyvsp[0].p, endloc); } -- break; -- -- case 3: --#line 100 "awkgram.y" -- { yyclearin; bracecheck(); SYNTAX("bailing out"); } -- break; -- -- case 14: --#line 124 "awkgram.y" -- {inloop++;} -- break; -- -- case 15: --#line 125 "awkgram.y" -- { --inloop; yyval.p = stat4(FOR, yyvsp[-9].p, notnull(yyvsp[-6].p), yyvsp[-3].p, yyvsp[0].p); } -- break; -- -- case 16: --#line 126 "awkgram.y" -- {inloop++;} -- break; -- -- case 17: --#line 127 "awkgram.y" -- { --inloop; yyval.p = stat4(FOR, yyvsp[-7].p, NIL, yyvsp[-3].p, yyvsp[0].p); } -- break; -- -- case 18: --#line 128 "awkgram.y" -- {inloop++;} -- break; -- -- case 19: --#line 129 "awkgram.y" -- { --inloop; yyval.p = stat3(IN, yyvsp[-5].p, makearr(yyvsp[-3].p), yyvsp[0].p); } -- break; -- -- case 20: --#line 133 "awkgram.y" -- { setfname(yyvsp[0].cp); } -- break; -- -- case 21: --#line 134 "awkgram.y" -- { setfname(yyvsp[0].cp); } -- break; -- -- case 22: --#line 138 "awkgram.y" -- { yyval.p = notnull(yyvsp[-1].p); } -- break; -- -- case 27: --#line 150 "awkgram.y" -- { yyval.i = 0; } -- break; -- -- case 29: --#line 155 "awkgram.y" -- { yyval.i = 0; } -- break; -- -- case 31: --#line 161 "awkgram.y" -- { yyval.p = 0; } -- break; -- -- case 33: --#line 166 "awkgram.y" -- { yyval.p = 0; } -- break; -- -- case 34: --#line 167 "awkgram.y" -- { yyval.p = yyvsp[-1].p; } -- break; -- -- case 35: --#line 171 "awkgram.y" -- { yyval.p = notnull(yyvsp[0].p); } -- break; -- -- case 36: --#line 175 "awkgram.y" -- { yyval.p = stat2(PASTAT, yyvsp[0].p, stat2(PRINT, rectonode(), NIL)); } -- break; -- -- case 37: --#line 176 "awkgram.y" -- { yyval.p = stat2(PASTAT, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 38: --#line 177 "awkgram.y" -- { yyval.p = pa2stat(yyvsp[-2].p, yyvsp[0].p, stat2(PRINT, rectonode(), NIL)); } -- break; -- -- case 39: --#line 178 "awkgram.y" -- { yyval.p = pa2stat(yyvsp[-5].p, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 40: --#line 179 "awkgram.y" -- { yyval.p = stat2(PASTAT, NIL, yyvsp[-1].p); } -- break; -- -- case 41: --#line 181 "awkgram.y" -- { beginloc = linkum(beginloc, yyvsp[-1].p); yyval.p = 0; } -- break; -- -- case 42: --#line 183 "awkgram.y" -- { endloc = linkum(endloc, yyvsp[-1].p); yyval.p = 0; } -- break; -- -- case 43: --#line 184 "awkgram.y" -- {infunc++;} -- break; -- -- case 44: --#line 185 "awkgram.y" -- { infunc--; curfname=0; defn((Cell *)yyvsp[-7].p, yyvsp[-5].p, yyvsp[-1].p); yyval.p = 0; } -- break; -- -- case 46: --#line 190 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 48: --#line 195 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 49: --#line 199 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 50: --#line 201 "awkgram.y" -- { yyval.p = op3(CONDEXPR, notnull(yyvsp[-4].p), yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 51: --#line 203 "awkgram.y" -- { yyval.p = op2(BOR, notnull(yyvsp[-2].p), notnull(yyvsp[0].p)); } -- break; -- -- case 52: --#line 205 "awkgram.y" -- { yyval.p = op2(AND, notnull(yyvsp[-2].p), notnull(yyvsp[0].p)); } -- break; -- -- case 53: --#line 206 "awkgram.y" -- { yyval.p = op3(yyvsp[-1].i, NIL, yyvsp[-2].p, (Node*)makedfa(yyvsp[0].s, 0)); } -- break; -- -- case 54: --#line 208 "awkgram.y" -- { if (constnode(yyvsp[0].p)) -- yyval.p = op3(yyvsp[-1].i, NIL, yyvsp[-2].p, (Node*)makedfa(strnode(yyvsp[0].p), 0)); -- else -- yyval.p = op3(yyvsp[-1].i, (Node *)1, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 55: --#line 212 "awkgram.y" -- { yyval.p = op2(INTEST, yyvsp[-2].p, makearr(yyvsp[0].p)); } -- break; -- -- case 56: --#line 213 "awkgram.y" -- { yyval.p = op2(INTEST, yyvsp[-3].p, makearr(yyvsp[0].p)); } -- break; -- -- case 57: --#line 214 "awkgram.y" -- { yyval.p = op2(CAT, yyvsp[-1].p, yyvsp[0].p); } -- break; -- -- case 60: --#line 220 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 61: --#line 222 "awkgram.y" -- { yyval.p = op3(CONDEXPR, notnull(yyvsp[-4].p), yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 62: --#line 224 "awkgram.y" -- { yyval.p = op2(BOR, notnull(yyvsp[-2].p), notnull(yyvsp[0].p)); } -- break; -- -- case 63: --#line 226 "awkgram.y" -- { yyval.p = op2(AND, notnull(yyvsp[-2].p), notnull(yyvsp[0].p)); } -- break; -- -- case 64: --#line 227 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 65: --#line 228 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 66: --#line 229 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 67: --#line 230 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 68: --#line 231 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 69: --#line 232 "awkgram.y" -- { yyval.p = op2(yyvsp[-1].i, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 70: --#line 233 "awkgram.y" -- { yyval.p = op3(yyvsp[-1].i, NIL, yyvsp[-2].p, (Node*)makedfa(yyvsp[0].s, 0)); } -- break; -- -- case 71: --#line 235 "awkgram.y" -- { if (constnode(yyvsp[0].p)) -- yyval.p = op3(yyvsp[-1].i, NIL, yyvsp[-2].p, (Node*)makedfa(strnode(yyvsp[0].p), 0)); -- else -- yyval.p = op3(yyvsp[-1].i, (Node *)1, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 72: --#line 239 "awkgram.y" -- { yyval.p = op2(INTEST, yyvsp[-2].p, makearr(yyvsp[0].p)); } -- break; -- -- case 73: --#line 240 "awkgram.y" -- { yyval.p = op2(INTEST, yyvsp[-3].p, makearr(yyvsp[0].p)); } -- break; -- -- case 74: --#line 241 "awkgram.y" -- { -- if (safe) SYNTAX("cmd | getline is unsafe"); -- else yyval.p = op3(GETLINE, yyvsp[0].p, itonp(yyvsp[-2].i), yyvsp[-3].p); } -- break; -- -- case 75: --#line 244 "awkgram.y" -- { -- if (safe) SYNTAX("cmd | getline is unsafe"); -- else yyval.p = op3(GETLINE, (Node*)0, itonp(yyvsp[-1].i), yyvsp[-2].p); } -- break; -- -- case 76: --#line 247 "awkgram.y" -- { yyval.p = op2(CAT, yyvsp[-1].p, yyvsp[0].p); } -- break; -- -- case 79: --#line 253 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 80: --#line 254 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 82: --#line 259 "awkgram.y" -- { yyval.p = linkum(yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 83: --#line 263 "awkgram.y" -- { yyval.p = rectonode(); } -- break; -- -- case 85: --#line 265 "awkgram.y" -- { yyval.p = yyvsp[-1].p; } -- break; -- -- case 94: --#line 282 "awkgram.y" -- { yyval.p = op3(MATCH, NIL, rectonode(), (Node*)makedfa(yyvsp[0].s, 0)); } -- break; -- -- case 95: --#line 283 "awkgram.y" -- { yyval.p = op1(NOT, notnull(yyvsp[0].p)); } -- break; -- -- case 96: --#line 287 "awkgram.y" -- {startreg();} -- break; -- -- case 97: --#line 287 "awkgram.y" -- { yyval.s = yyvsp[-1].s; } -- break; -- -- case 100: --#line 295 "awkgram.y" -- { -- if (safe) SYNTAX("print | is unsafe"); -- else yyval.p = stat3(yyvsp[-3].i, yyvsp[-2].p, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 101: --#line 298 "awkgram.y" -- { -- if (safe) SYNTAX("print >> is unsafe"); -- else yyval.p = stat3(yyvsp[-3].i, yyvsp[-2].p, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 102: --#line 301 "awkgram.y" -- { -- if (safe) SYNTAX("print > is unsafe"); -- else yyval.p = stat3(yyvsp[-3].i, yyvsp[-2].p, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 103: --#line 304 "awkgram.y" -- { yyval.p = stat3(yyvsp[-1].i, yyvsp[0].p, NIL, NIL); } -- break; -- -- case 104: --#line 305 "awkgram.y" -- { yyval.p = stat2(DELETE, makearr(yyvsp[-3].p), yyvsp[-1].p); } -- break; -- -- case 105: --#line 306 "awkgram.y" -- { yyval.p = stat2(DELETE, makearr(yyvsp[0].p), 0); } -- break; -- -- case 106: --#line 307 "awkgram.y" -- { yyval.p = exptostat(yyvsp[0].p); } -- break; -- -- case 107: --#line 308 "awkgram.y" -- { yyclearin; SYNTAX("illegal statement"); } -- break; -- -- case 110: --#line 317 "awkgram.y" -- { if (!inloop) SYNTAX("break illegal outside of loops"); -- yyval.p = stat1(BREAK, NIL); } -- break; -- -- case 111: --#line 319 "awkgram.y" -- { if (!inloop) SYNTAX("continue illegal outside of loops"); -- yyval.p = stat1(CONTINUE, NIL); } -- break; -- -- case 112: --#line 321 "awkgram.y" -- {inloop++;} -- break; -- -- case 113: --#line 321 "awkgram.y" -- {--inloop;} -- break; -- -- case 114: --#line 322 "awkgram.y" -- { yyval.p = stat2(DO, yyvsp[-6].p, notnull(yyvsp[-2].p)); } -- break; -- -- case 115: --#line 323 "awkgram.y" -- { yyval.p = stat1(EXIT, yyvsp[-1].p); } -- break; -- -- case 116: --#line 324 "awkgram.y" -- { yyval.p = stat1(EXIT, NIL); } -- break; -- -- case 118: --#line 326 "awkgram.y" -- { yyval.p = stat3(IF, yyvsp[-3].p, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 119: --#line 327 "awkgram.y" -- { yyval.p = stat3(IF, yyvsp[-1].p, yyvsp[0].p, NIL); } -- break; -- -- case 120: --#line 328 "awkgram.y" -- { yyval.p = yyvsp[-1].p; } -- break; -- -- case 121: --#line 329 "awkgram.y" -- { if (infunc) -- SYNTAX("next is illegal inside a function"); -- yyval.p = stat1(NEXT, NIL); } -- break; -- -- case 122: --#line 332 "awkgram.y" -- { if (infunc) -- SYNTAX("nextfile is illegal inside a function"); -- yyval.p = stat1(NEXTFILE, NIL); } -- break; -- -- case 123: --#line 335 "awkgram.y" -- { yyval.p = stat1(RETURN, yyvsp[-1].p); } -- break; -- -- case 124: --#line 336 "awkgram.y" -- { yyval.p = stat1(RETURN, NIL); } -- break; -- -- case 126: --#line 338 "awkgram.y" -- {inloop++;} -- break; -- -- case 127: --#line 338 "awkgram.y" -- { --inloop; yyval.p = stat2(WHILE, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 128: --#line 339 "awkgram.y" -- { yyval.p = 0; } -- break; -- -- case 130: --#line 344 "awkgram.y" -- { yyval.p = linkum(yyvsp[-1].p, yyvsp[0].p); } -- break; -- -- case 133: --#line 352 "awkgram.y" -- { yyval.p = op2(DIVEQ, yyvsp[-3].p, yyvsp[0].p); } -- break; -- -- case 134: --#line 353 "awkgram.y" -- { yyval.p = op2(ADD, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 135: --#line 354 "awkgram.y" -- { yyval.p = op2(MINUS, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 136: --#line 355 "awkgram.y" -- { yyval.p = op2(MULT, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 137: --#line 356 "awkgram.y" -- { yyval.p = op2(DIVIDE, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 138: --#line 357 "awkgram.y" -- { yyval.p = op2(MOD, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 139: --#line 358 "awkgram.y" -- { yyval.p = op2(POWER, yyvsp[-2].p, yyvsp[0].p); } -- break; -- -- case 140: --#line 359 "awkgram.y" -- { yyval.p = op1(UMINUS, yyvsp[0].p); } -- break; -- -- case 141: --#line 360 "awkgram.y" -- { yyval.p = yyvsp[0].p; } -- break; -- -- case 142: --#line 361 "awkgram.y" -- { yyval.p = op1(NOT, notnull(yyvsp[0].p)); } -- break; -- -- case 143: --#line 362 "awkgram.y" -- { yyval.p = op2(BLTIN, itonp(yyvsp[-2].i), rectonode()); } -- break; -- -- case 144: --#line 363 "awkgram.y" -- { yyval.p = op2(BLTIN, itonp(yyvsp[-3].i), yyvsp[-1].p); } -- break; -- -- case 145: --#line 364 "awkgram.y" -- { yyval.p = op2(BLTIN, itonp(yyvsp[0].i), rectonode()); } -- break; -- -- case 146: --#line 365 "awkgram.y" -- { yyval.p = op2(CALL, celltonode(yyvsp[-2].cp,CVAR), NIL); } -- break; -- -- case 147: --#line 366 "awkgram.y" -- { yyval.p = op2(CALL, celltonode(yyvsp[-3].cp,CVAR), yyvsp[-1].p); } -- break; -- -- case 148: --#line 367 "awkgram.y" -- { yyval.p = op1(CLOSE, yyvsp[0].p); } -- break; -- -- case 149: --#line 368 "awkgram.y" -- { yyval.p = op1(PREDECR, yyvsp[0].p); } -- break; -- -- case 150: --#line 369 "awkgram.y" -- { yyval.p = op1(PREINCR, yyvsp[0].p); } -- break; -- -- case 151: --#line 370 "awkgram.y" -- { yyval.p = op1(POSTDECR, yyvsp[-1].p); } -- break; -- -- case 152: --#line 371 "awkgram.y" -- { yyval.p = op1(POSTINCR, yyvsp[-1].p); } -- break; -- -- case 153: --#line 372 "awkgram.y" -- { yyval.p = op3(GETLINE, yyvsp[-2].p, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 154: --#line 373 "awkgram.y" -- { yyval.p = op3(GETLINE, NIL, itonp(yyvsp[-1].i), yyvsp[0].p); } -- break; -- -- case 155: --#line 374 "awkgram.y" -- { yyval.p = op3(GETLINE, yyvsp[0].p, NIL, NIL); } -- break; -- -- case 156: --#line 375 "awkgram.y" -- { yyval.p = op3(GETLINE, NIL, NIL, NIL); } -- break; -- -- case 157: --#line 377 "awkgram.y" -- { yyval.p = op2(INDEX, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 158: --#line 379 "awkgram.y" -- { SYNTAX("index() doesn't permit regular expressions"); -- yyval.p = op2(INDEX, yyvsp[-3].p, (Node*)yyvsp[-1].s); } -- break; -- -- case 159: --#line 381 "awkgram.y" -- { yyval.p = yyvsp[-1].p; } -- break; -- -- case 160: --#line 383 "awkgram.y" -- { yyval.p = op3(MATCHFCN, NIL, yyvsp[-3].p, (Node*)makedfa(yyvsp[-1].s, 1)); } -- break; -- -- case 161: --#line 385 "awkgram.y" -- { if (constnode(yyvsp[-1].p)) -- yyval.p = op3(MATCHFCN, NIL, yyvsp[-3].p, (Node*)makedfa(strnode(yyvsp[-1].p), 1)); -- else -- yyval.p = op3(MATCHFCN, (Node *)1, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 162: --#line 389 "awkgram.y" -- { yyval.p = celltonode(yyvsp[0].cp, CCON); } -- break; -- -- case 163: --#line 391 "awkgram.y" -- { yyval.p = op4(SPLIT, yyvsp[-5].p, makearr(yyvsp[-3].p), yyvsp[-1].p, (Node*)STRING); } -- break; -- -- case 164: --#line 393 "awkgram.y" -- { yyval.p = op4(SPLIT, yyvsp[-5].p, makearr(yyvsp[-3].p), (Node*)makedfa(yyvsp[-1].s, 1), (Node *)REGEXPR); } -- break; -- -- case 165: --#line 395 "awkgram.y" -- { yyval.p = op4(SPLIT, yyvsp[-3].p, makearr(yyvsp[-1].p), NIL, (Node*)STRING); } -- break; -- -- case 166: --#line 396 "awkgram.y" -- { yyval.p = op1(yyvsp[-3].i, yyvsp[-1].p); } -- break; -- -- case 167: --#line 397 "awkgram.y" -- { yyval.p = celltonode(yyvsp[0].cp, CCON); } -- break; -- -- case 168: --#line 399 "awkgram.y" -- { yyval.p = op4(yyvsp[-5].i, NIL, (Node*)makedfa(yyvsp[-3].s, 1), yyvsp[-1].p, rectonode()); } -- break; -- -- case 169: --#line 401 "awkgram.y" -- { if (constnode(yyvsp[-3].p)) -- yyval.p = op4(yyvsp[-5].i, NIL, (Node*)makedfa(strnode(yyvsp[-3].p), 1), yyvsp[-1].p, rectonode()); -- else -- yyval.p = op4(yyvsp[-5].i, (Node *)1, yyvsp[-3].p, yyvsp[-1].p, rectonode()); } -- break; -- -- case 170: --#line 406 "awkgram.y" -- { yyval.p = op4(yyvsp[-7].i, NIL, (Node*)makedfa(yyvsp[-5].s, 1), yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 171: --#line 408 "awkgram.y" -- { if (constnode(yyvsp[-5].p)) -- yyval.p = op4(yyvsp[-7].i, NIL, (Node*)makedfa(strnode(yyvsp[-5].p), 1), yyvsp[-3].p, yyvsp[-1].p); -- else -- yyval.p = op4(yyvsp[-7].i, (Node *)1, yyvsp[-5].p, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 172: --#line 413 "awkgram.y" -- { yyval.p = op3(SUBSTR, yyvsp[-5].p, yyvsp[-3].p, yyvsp[-1].p); } -- break; -- -- case 173: --#line 415 "awkgram.y" -- { yyval.p = op3(SUBSTR, yyvsp[-3].p, yyvsp[-1].p, NIL); } -- break; -- -- case 176: --#line 421 "awkgram.y" -- { yyval.p = op2(ARRAY, makearr(yyvsp[-3].p), yyvsp[-1].p); } -- break; -- -- case 177: --#line 422 "awkgram.y" -- { yyval.p = op1(INDIRECT, celltonode(yyvsp[0].cp, CVAR)); } -- break; -- -- case 178: --#line 423 "awkgram.y" -- { yyval.p = op1(INDIRECT, yyvsp[0].p); } -- break; -- -- case 179: --#line 427 "awkgram.y" -- { arglist = yyval.p = 0; } -- break; -- -- case 180: --#line 428 "awkgram.y" -- { arglist = yyval.p = celltonode(yyvsp[0].cp,CVAR); } -- break; -- -- case 181: --#line 429 "awkgram.y" -- { -- checkdup(yyvsp[-2].p, yyvsp[0].cp); -- arglist = yyval.p = linkum(yyvsp[-2].p,celltonode(yyvsp[0].cp,CVAR)); } -- break; -- -- case 182: --#line 435 "awkgram.y" -- { yyval.p = celltonode(yyvsp[0].cp, CVAR); } -- break; -- -- case 183: --#line 436 "awkgram.y" -- { yyval.p = op1(ARG, itonp(yyvsp[0].i)); } -- break; -- -- case 184: --#line 437 "awkgram.y" -- { yyval.p = op1(VARNF, (Node *) yyvsp[0].cp); } -- break; -- -- case 185: --#line 442 "awkgram.y" -- { yyval.p = notnull(yyvsp[-1].p); } -- break; -- -- -- } -- --/* Line 991 of yacc.c. */ --#line 3099 "y.tab.c" -- -- yyvsp -= yylen; -- yyssp -= yylen; -- -- -- YY_STACK_PRINT (yyss, yyssp); -- -- *++yyvsp = yyval; -- -- -- /* Now `shift' the result of the reduction. Determine what state -- that goes to, based on the state we popped back to and the rule -- number reduced by. */ -- -- yyn = yyr1[yyn]; -- -- yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; -- if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) -- yystate = yytable[yystate]; -- else -- yystate = yydefgoto[yyn - YYNTOKENS]; -- -- goto yynewstate; -- -- --/*------------------------------------. --| yyerrlab -- here on detecting error | --`------------------------------------*/ --yyerrlab: -- /* If not already recovering from an error, report this error. */ -- if (!yyerrstatus) -- { -- ++yynerrs; --#if YYERROR_VERBOSE -- yyn = yypact[yystate]; -- -- if (YYPACT_NINF < yyn && yyn < YYLAST) -- { -- YYSIZE_T yysize = 0; -- int yytype = YYTRANSLATE (yychar); -- char *yymsg; -- int yyx, yycount; -- -- yycount = 0; -- /* Start YYX at -YYN if negative to avoid negative indexes in -- YYCHECK. */ -- for (yyx = yyn < 0 ? -yyn : 0; -- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) -- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) -- yysize += yystrlen (yytname[yyx]) + 15, yycount++; -- yysize += yystrlen ("syntax error, unexpected ") + 1; -- yysize += yystrlen (yytname[yytype]); -- yymsg = (char *) YYSTACK_ALLOC (yysize); -- if (yymsg != 0) -- { -- char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); -- yyp = yystpcpy (yyp, yytname[yytype]); -- -- if (yycount < 5) -- { -- yycount = 0; -- for (yyx = yyn < 0 ? -yyn : 0; -- yyx < (int) (sizeof (yytname) / sizeof (char *)); -- yyx++) -- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) -- { -- const char *yyq = ! yycount ? ", expecting " : " or "; -- yyp = yystpcpy (yyp, yyq); -- yyp = yystpcpy (yyp, yytname[yyx]); -- yycount++; -- } -- } -- yyerror (yymsg); -- YYSTACK_FREE (yymsg); -- } -- else -- yyerror ("syntax error; also virtual memory exhausted"); -- } -- else --#endif /* YYERROR_VERBOSE */ -- yyerror ("syntax error"); -- } -- -- -- -- if (yyerrstatus == 3) -- { -- /* If just tried and failed to reuse lookahead token after an -- error, discard it. */ -- -- /* Return failure if at end of input. */ -- if (yychar == YYEOF) -- { -- /* Pop the error token. */ -- YYPOPSTACK; -- /* Pop the rest of the stack. */ -- while (yyss < yyssp) -- { -- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); -- yydestruct (yystos[*yyssp], yyvsp); -- YYPOPSTACK; -- } -- YYABORT; -- } -- -- YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); -- yydestruct (yytoken, &yylval); -- yychar = YYEMPTY; -- -- } -- -- /* Else will try to reuse lookahead token after shifting the error -- token. */ -- goto yyerrlab2; -- -- --/*----------------------------------------------------. --| yyerrlab1 -- error raised explicitly by an action. | --`----------------------------------------------------*/ --yyerrlab1: -- -- /* Suppress GCC warning that yyerrlab1 is unused when no action -- invokes YYERROR. */ --#if defined (__GNUC_MINOR__) && 2093 <= (__GNUC__ * 1000 + __GNUC_MINOR__) -- __attribute__ ((__unused__)) --#endif -- -- -- goto yyerrlab2; -- -- --/*---------------------------------------------------------------. --| yyerrlab2 -- pop states until the error token can be shifted. | --`---------------------------------------------------------------*/ --yyerrlab2: -- yyerrstatus = 3; /* Each real token shifted decrements this. */ -- -- for (;;) -- { -- yyn = yypact[yystate]; -- if (yyn != YYPACT_NINF) -- { -- yyn += YYTERROR; -- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) -- { -- yyn = yytable[yyn]; -- if (0 < yyn) -- break; -- } -- } -- -- /* Pop the current state because it cannot handle the error token. */ -- if (yyssp == yyss) -- YYABORT; -- -- YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); -- yydestruct (yystos[yystate], yyvsp); -- yyvsp--; -- yystate = *--yyssp; -- -- YY_STACK_PRINT (yyss, yyssp); -- } -- -- if (yyn == YYFINAL) -- YYACCEPT; -- -- YYDPRINTF ((stderr, "Shifting error token, ")); -- -- *++yyvsp = yylval; -- -- -- yystate = yyn; -- goto yynewstate; -- -- --/*-------------------------------------. --| yyacceptlab -- YYACCEPT comes here. | --`-------------------------------------*/ --yyacceptlab: -- yyresult = 0; -- goto yyreturn; -- --/*-----------------------------------. --| yyabortlab -- YYABORT comes here. | --`-----------------------------------*/ --yyabortlab: -- yyresult = 1; -- goto yyreturn; -- --#ifndef yyoverflow --/*----------------------------------------------. --| yyoverflowlab -- parser overflow comes here. | --`----------------------------------------------*/ --yyoverflowlab: -- yyerror ("parser stack overflow"); -- yyresult = 2; -- /* Fall through. */ --#endif -- --yyreturn: --#ifndef yyoverflow -- if (yyss != yyssa) -- YYSTACK_FREE (yyss); --#endif -- return yyresult; --} -- -- --#line 445 "awkgram.y" -- -- --void setfname(Cell *p) --{ -- if (isarr(p)) -- SYNTAX("%s is an array, not a function", p->nval); -- else if (isfcn(p)) -- SYNTAX("you can't define function %s more than once", p->nval); -- curfname = p->nval; --} -- --int constnode(Node *p) --{ -- return isvalue(p) && ((Cell *) (p->narg[0]))->csub == CCON; --} -- --char *strnode(Node *p) --{ -- return ((Cell *)(p->narg[0]))->sval; --} -- --Node *notnull(Node *n) --{ -- switch (n->nobj) { -- case LE: case LT: case EQ: case NE: case GT: case GE: -- case BOR: case AND: case NOT: -- return n; -- default: -- return op2(NE, n, nullnode); -- } --} -- --void checkdup(Node *vl, Cell *cp) /* check if name already in list */ --{ -- char *s = cp->nval; -- for ( ; vl; vl = vl->nnext) { -- if (strcmp(s, ((Cell *)(vl->narg[0]))->nval) == 0) { -- SYNTAX("duplicate argument %s", s); -- break; -- } -- } --} -- -//GO.SYSIN DD ytabc.bak -echo ytabh.bak 1>&2 -sed 's/.//' >ytabh.bak <<'//GO.SYSIN DD ytabh.bak' --/* A Bison parser, made by GNU Bison 1.875. */ -- --/* Skeleton parser for Yacc-like parsing with Bison, -- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2, or (at your option) -- any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place - Suite 330, -- Boston, MA 02111-1307, USA. */ -- --/* As a special exception, when this file is copied by Bison into a -- Bison output file, you may use that output file without restriction. -- This special exception was added by the Free Software Foundation -- in version 1.24 of Bison. */ -- --/* Tokens. */ --#ifndef YYTOKENTYPE --# define YYTOKENTYPE -- /* Put the tokens into the symbol table, so that GDB and other debuggers -- know about them. */ -- enum yytokentype { -- FIRSTTOKEN = 258, -- PROGRAM = 259, -- PASTAT = 260, -- PASTAT2 = 261, -- XBEGIN = 262, -- XEND = 263, -- NL = 264, -- ARRAY = 265, -- MATCH = 266, -- NOTMATCH = 267, -- MATCHOP = 268, -- FINAL = 269, -- DOT = 270, -- ALL = 271, -- CCL = 272, -- NCCL = 273, -- CHAR = 274, -- OR = 275, -- STAR = 276, -- QUEST = 277, -- PLUS = 278, -- AND = 279, -- BOR = 280, -- APPEND = 281, -- EQ = 282, -- GE = 283, -- GT = 284, -- LE = 285, -- LT = 286, -- NE = 287, -- IN = 288, -- ARG = 289, -- BLTIN = 290, -- BREAK = 291, -- CLOSE = 292, -- CONTINUE = 293, -- DELETE = 294, -- DO = 295, -- EXIT = 296, -- FOR = 297, -- FUNC = 298, -- SUB = 299, -- GSUB = 300, -- IF = 301, -- INDEX = 302, -- LSUBSTR = 303, -- MATCHFCN = 304, -- NEXT = 305, -- NEXTFILE = 306, -- ADD = 307, -- MINUS = 308, -- MULT = 309, -- DIVIDE = 310, -- MOD = 311, -- ASSIGN = 312, -- ASGNOP = 313, -- ADDEQ = 314, -- SUBEQ = 315, -- MULTEQ = 316, -- DIVEQ = 317, -- MODEQ = 318, -- POWEQ = 319, -- PRINT = 320, -- PRINTF = 321, -- SPRINTF = 322, -- ELSE = 323, -- INTEST = 324, -- CONDEXPR = 325, -- POSTINCR = 326, -- PREINCR = 327, -- POSTDECR = 328, -- PREDECR = 329, -- VAR = 330, -- IVAR = 331, -- VARNF = 332, -- CALL = 333, -- NUMBER = 334, -- STRING = 335, -- REGEXPR = 336, -- GETLINE = 337, -- SUBSTR = 338, -- SPLIT = 339, -- RETURN = 340, -- WHILE = 341, -- CAT = 342, -- UMINUS = 343, -- NOT = 344, -- POWER = 345, -- INCR = 346, -- DECR = 347, -- INDIRECT = 348, -- LASTTOKEN = 349 -- }; --#endif --#define FIRSTTOKEN 258 --#define PROGRAM 259 --#define PASTAT 260 --#define PASTAT2 261 --#define XBEGIN 262 --#define XEND 263 --#define NL 264 --#define ARRAY 265 --#define MATCH 266 --#define NOTMATCH 267 --#define MATCHOP 268 --#define FINAL 269 --#define DOT 270 --#define ALL 271 --#define CCL 272 --#define NCCL 273 --#define CHAR 274 --#define OR 275 --#define STAR 276 --#define QUEST 277 --#define PLUS 278 --#define AND 279 --#define BOR 280 --#define APPEND 281 --#define EQ 282 --#define GE 283 --#define GT 284 --#define LE 285 --#define LT 286 --#define NE 287 --#define IN 288 --#define ARG 289 --#define BLTIN 290 --#define BREAK 291 --#define CLOSE 292 --#define CONTINUE 293 --#define DELETE 294 --#define DO 295 --#define EXIT 296 --#define FOR 297 --#define FUNC 298 --#define SUB 299 --#define GSUB 300 --#define IF 301 --#define INDEX 302 --#define LSUBSTR 303 --#define MATCHFCN 304 --#define NEXT 305 --#define NEXTFILE 306 --#define ADD 307 --#define MINUS 308 --#define MULT 309 --#define DIVIDE 310 --#define MOD 311 --#define ASSIGN 312 --#define ASGNOP 313 --#define ADDEQ 314 --#define SUBEQ 315 --#define MULTEQ 316 --#define DIVEQ 317 --#define MODEQ 318 --#define POWEQ 319 --#define PRINT 320 --#define PRINTF 321 --#define SPRINTF 322 --#define ELSE 323 --#define INTEST 324 --#define CONDEXPR 325 --#define POSTINCR 326 --#define PREINCR 327 --#define POSTDECR 328 --#define PREDECR 329 --#define VAR 330 --#define IVAR 331 --#define VARNF 332 --#define CALL 333 --#define NUMBER 334 --#define STRING 335 --#define REGEXPR 336 --#define GETLINE 337 --#define SUBSTR 338 --#define SPLIT 339 --#define RETURN 340 --#define WHILE 341 --#define CAT 342 --#define UMINUS 343 --#define NOT 344 --#define POWER 345 --#define INCR 346 --#define DECR 347 --#define INDIRECT 348 --#define LASTTOKEN 349 -- -- -- -- --#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) --#line 41 "awkgram.y" --typedef union YYSTYPE { -- Node *p; -- Cell *cp; -- int i; -- char *s; --} YYSTYPE; --/* Line 1248 of yacc.c. */ --#line 231 "y.tab.h" --# define yystype YYSTYPE /* obsolescent; will be withdrawn */ --# define YYSTYPE_IS_DECLARED 1 --# define YYSTYPE_IS_TRIVIAL 1 --#endif -- --extern YYSTYPE yylval; -- -- -- -//GO.SYSIN DD ytabh.bak -echo makefile 1>&2 -sed 's/.//' >makefile <<'//GO.SYSIN DD makefile' --# /**************************************************************** --# Copyright (C) Lucent Technologies 1997 --# All Rights Reserved --# --# Permission to use, copy, modify, and distribute this software and --# its documentation for any purpose and without fee is hereby --# granted, provided that the above copyright notice appear in all --# copies and that both that the copyright notice and this --# permission notice and warranty disclaimer appear in supporting --# documentation, and that the name Lucent Technologies or any of --# its entities not be used in advertising or publicity pertaining --# to distribution of the software without specific, written prior --# permission. --# --# LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, --# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. --# IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY --# SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER --# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, --# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF --# THIS SOFTWARE. --# ****************************************************************/ -- --CFLAGS = -g --CFLAGS = -O2 --CFLAGS = -- --CC = gcc -Wall -g -Wwrite-strings --CC = gcc -fprofile-arcs -ftest-coverage -- # followed by gcov onefile.c; cat onefile.c.gcov --CC = gcc -Wall -g --CC = cc -- --YACC = bison -y --YACC = yacc --YFLAGS = -d -- --OFILES = b.o main.o parse.o proctab.o tran.o lib.o run.o lex.o -- --SOURCE = awk.h ytab.c ytab.h proto.h awkgram.y lex.c b.c main.c \ -- maketab.c parse.c lib.c run.c tran.c proctab.c missing95.c -- --LISTING = awk.h proto.h awkgram.y lex.c b.c main.c maketab.c parse.c \ -- lib.c run.c tran.c missing95.c -- --SHIP = README FIXES $(SOURCE) ytab[ch].bak makefile makefile.win \ -- vcvars32.bat buildwin.bat mac.code awk.1 -- --a.out: ytab.o $(OFILES) -- $(CC) $(CFLAGS) ytab.o $(OFILES) $(ALLOC) -lm -- --$(OFILES): awk.h ytab.h proto.h -- --ytab.o: awk.h proto.h awkgram.y -- $(YACC) $(YFLAGS) awkgram.y -- mv y.tab.c ytab.c -- mv y.tab.h ytab.h -- $(CC) $(CFLAGS) -c ytab.c -- --proctab.c: maketab -- ./maketab >proctab.c -- --maketab: ytab.h maketab.c -- $(CC) $(CFLAGS) maketab.c -o maketab -- --bundle: -- @cp ytab.h ytabh.bak -- @cp ytab.c ytabc.bak -- @bundle $(SHIP) -- --tar: -- @cp ytab.h ytabh.bak -- @cp ytab.c ytabc.bak -- @bundle $(SHIP) >awk.shar -- @tar cf awk.tar $(SHIP) -- gzip awk.tar -- ls -l awk.tar.gz -- @zip awk.zip $(SHIP) -- ls -l awk.zip -- --names: -- @echo $(LISTING) -- --clean: -- rm -f a.out *.o *.obj maketab maketab.exe *.bb *.bbg *.da *.gcov # proctab.c -//GO.SYSIN DD makefile -echo makefile.win 1>&2 -sed 's/.//' >makefile.win <<'//GO.SYSIN DD makefile.win' --# vestigial makefile for microsoft c compiler on WinXX --# run with nmake -f makefile.win --# based on buildwin.bat -- --awk95.exe: -- set cl=-w -Ox -QIfdiv- -nologo -link -nologo setargv.obj -- cl maketab.c -o maketab.exe -- .\maketab.exe > proctab.c -- cl -o awk95.exe b.c main.c parse.c proctab.c tran.c lib.c run.c lex.c ytab.c missing95.c -//GO.SYSIN DD makefile.win -echo vcvars32.bat 1>&2 -sed 's/.//' >vcvars32.bat <<'//GO.SYSIN DD vcvars32.bat' --@echo off
--rem
--rem Root of Visual Developer Studio Common files.
--set VSCommonDir=C:\PROGRA~1\MICROS~3\Common
--
--rem
--rem Root of Visual Developer Studio installed files.
--rem
--set MSDevDir=C:\PROGRA~1\MICROS~3\Common\msdev98
--
--rem
--rem Root of Visual C++ installed files.
--rem
--set MSVCDir=C:\PROGRA~1\MICROS~3\VC98
--
--rem
--rem VcOsDir is used to help create either a Windows 95 or Windows NT specific path.
--rem
--set VcOsDir=WIN95
--if "%OS%" == "Windows_NT" set VcOsDir=WINNT
--
--rem
--echo Setting environment for using Microsoft Visual C++ tools.
--rem
--
--if "%OS%" == "Windows_NT" set PATH=%MSDevDir%\BIN;%MSVCDir%\BIN;%VSCommonDir%\TOOLS\%VcOsDir%;%VSCommonDir%\TOOLS;%PATH%
--if "%OS%" == "" set PATH="%MSDevDir%\BIN";"%MSVCDir%\BIN";"%VSCommonDir%\TOOLS\%VcOsDir%";"%VSCommonDir%\TOOLS";"%windir%\SYSTEM";"%PATH%"
--set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%
--set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%
--
--set VcOsDir=
--set VSCommonDir=
--
-//GO.SYSIN DD vcvars32.bat -echo buildwin.bat 1>&2 -sed 's/.//' >buildwin.bat <<'//GO.SYSIN DD buildwin.bat' --@echo off
--rem buildwin.bat - build AWK under Windows NT using Visual C++.
--rem 22 Jan 1999 - Created by Dan Allen.
--rem
--rem If you delete the call to setlocal it will probably work under Win95/Win98 as well.
--
--setlocal
--set cl=-w -Ox -QIfdiv- -nologo -link -nologo setargv.obj
--
--cl maketab.c -o maketab.exe
--maketab.exe > proctab.c
--cl -o awk.exe b.c main.c parse.c proctab.c tran.c lib.c run.c lex.c ytab.c missing95.c
-//GO.SYSIN DD buildwin.bat -echo mac.code 1>&2 -sed 's/.//' >mac.code <<'//GO.SYSIN DD mac.code' --Note added June, 2002: -- --With the advent of OS X, life is simpler: if you have the developer --tools installed, the standard awk makefile and gcc works fine, and --you can ignore the rest of this file, which is now hereby deprecated. -- -- -- -- --This file contains a make shell script and a version of the file --missing95.c for the Mac, courtesy of Dan Allen. -- --make shell script: -- --# MPW Shell script to build Awk using Apple's MRC compiler. --# 22 Jan 1999 - Created by Dan Allen. --# 25 Mar 1999 - Updated for newer Awk. --# --# Porting notes for the Mac: --# --# 1. main in main.c needs to have its prototype changed to: --# --# int main(int argc, char *argv[], char *environ[]) --# --# 2. popen and pclose in missing95.c need to have as their body the --# older style --# --# return NULL; --# --# as parallel pipes are not supported by MPW. --# --# 3. To make your Mac more responsive while long awk scripts run, --# you may want to add some SpinCursor calls to support cooperative multitasking. --# --# All of these minor changes can be put under "#ifdef powerc" for portability's sake. --# --# -- --If {1} == "clean" -- Delete -i awk maketab maketab.c.o ytab.c.o b.c.o main.c.o parse.c.o proctab.c proctab.c.o tran.c.o lib.c.o run.c.o lex.c.o missing95.c.o --Else -- MRC ytab.c -w off -opt speed -- MRC b.c -w off -opt speed -- MRC main.c -w off -opt speed -- MRC parse.c -w off -opt speed -- MRC maketab.c -w off -opt speed -- PPCLink -o maketab maketab.c.o "{PPCLibraries}InterfaceLib" "{PPCLibraries}MathLib" "{PPCLibraries}StdCLib" "{PPCLibraries}StdCRuntime.o" "{PPCLibraries}PPCCRuntime.o" "{PPCLibraries}PPCToolLibs.o" -t MPST -c 'MPS ' -- maketab > proctab.c -- MRC proctab.c -w off -opt speed -- MRC tran.c -w off -opt speed -- MRC lib.c -w off -opt speed -- MRC run.c -w off -opt speed -- MRC lex.c -w off -opt speed -- MRC missing95.c -w off -opt speed -- PPCLink -o awk ytab.c.o b.c.o main.c.o parse.c.o proctab.c.o tran.c.o lib.c.o run.c.o lex.c.o missing95.c.o "{PPCLibraries}InterfaceLib" "{PPCLibraries}MathLib" "{PPCLibraries}StdCLib" "{PPCLibraries}StdCRuntime.o" "{PPCLibraries}PPCCRuntime.o" "{PPCLibraries}PPCToolLibs.o" -d -- SetFile awk -d . -m . -t MPST -c 'MPS ' --End -- -- --missing95.c for the Mac: -- --/* popen and pclose are not available on the Mac. */ -- --#include <stdio.h> -- --FILE *popen(char *s, char *m) { -- return NULL; --} -- --int pclose(FILE *f) { -- return NULL; --} -- -//GO.SYSIN DD mac.code -echo awk.1 1>&2 -sed 's/.//' >awk.1 <<'//GO.SYSIN DD awk.1' --.de EX --.nf --.ft CW --.. --.de EE --.br --.fi --.ft 1 --.. --awk --.TH AWK 1 --.CT 1 files prog_other --.SH NAME --awk \- pattern-directed scanning and processing language --.SH SYNOPSIS --.B awk --[ --.BI \-F --.I fs --] --[ --.BI \-v --.I var=value --] --[ --.I 'prog' --| --.BI \-f --.I progfile --] --[ --.I file ... --] --.SH DESCRIPTION --.I Awk --scans each input --.I file --for lines that match any of a set of patterns specified literally in --.IR prog --or in one or more files --specified as --.B \-f --.IR progfile . --With each pattern --there can be an associated action that will be performed --when a line of a --.I file --matches the pattern. --Each line is matched against the --pattern portion of every pattern-action statement; --the associated action is performed for each matched pattern. --The file name --.B \- --means the standard input. --Any --.IR file --of the form --.I var=value --is treated as an assignment, not a filename, --and is executed at the time it would have been opened if it were a filename. --The option --.B \-v --followed by --.I var=value --is an assignment to be done before --.I prog --is executed; --any number of --.B \-v --options may be present. --The --.B \-F --.IR fs --option defines the input field separator to be the regular expression --.IR fs. --.PP --An input line is normally made up of fields separated by white space, --or by regular expression --.BR FS . --The fields are denoted --.BR $1 , --.BR $2 , --\&..., while --.B $0 --refers to the entire line. --If --.BR FS --is null, the input line is split into one field per character. --.PP --A pattern-action statement has the form --.IP --.IB pattern " { " action " } --.PP --A missing --.BI { " action " } --means print the line; --a missing pattern always matches. --Pattern-action statements are separated by newlines or semicolons. --.PP --An action is a sequence of statements. --A statement can be one of the following: --.PP --.EX --.ta \w'\f(CWdelete array[expression]'u --.RS --.nf --.ft CW --if(\fI expression \fP)\fI statement \fP\fR[ \fPelse\fI statement \fP\fR]\fP --while(\fI expression \fP)\fI statement\fP --for(\fI expression \fP;\fI expression \fP;\fI expression \fP)\fI statement\fP --for(\fI var \fPin\fI array \fP)\fI statement\fP --do\fI statement \fPwhile(\fI expression \fP) --break --continue --{\fR [\fP\fI statement ... \fP\fR] \fP} --\fIexpression\fP #\fR commonly\fP\fI var = expression\fP --print\fR [ \fP\fIexpression-list \fP\fR] \fP\fR[ \fP>\fI expression \fP\fR]\fP --printf\fI format \fP\fR[ \fP,\fI expression-list \fP\fR] \fP\fR[ \fP>\fI expression \fP\fR]\fP --return\fR [ \fP\fIexpression \fP\fR]\fP --next #\fR skip remaining patterns on this input line\fP --nextfile #\fR skip rest of this file, open next, start at top\fP --delete\fI array\fP[\fI expression \fP] #\fR delete an array element\fP --delete\fI array\fP #\fR delete all elements of array\fP --exit\fR [ \fP\fIexpression \fP\fR]\fP #\fR exit immediately; status is \fP\fIexpression\fP --.fi --.RE --.EE --.DT --.PP --Statements are terminated by --semicolons, newlines or right braces. --An empty --.I expression-list --stands for --.BR $0 . --String constants are quoted \&\f(CW"\ "\fR, --with the usual C escapes recognized within. --Expressions take on string or numeric values as appropriate, --and are built using the operators --.B + \- * / % ^ --(exponentiation), and concatenation (indicated by white space). --The operators --.B --! ++ \-\- += \-= *= /= %= ^= > >= < <= == != ?: --are also available in expressions. --Variables may be scalars, array elements --(denoted --.IB x [ i ] ) --or fields. --Variables are initialized to the null string. --Array subscripts may be any string, --not necessarily numeric; --this allows for a form of associative memory. --Multiple subscripts such as --.B [i,j,k] --are permitted; the constituents are concatenated, --separated by the value of --.BR SUBSEP . --.PP --The --.B print --statement prints its arguments on the standard output --(or on a file if --.BI > file --or --.BI >> file --is present or on a pipe if --.BI | cmd --is present), separated by the current output field separator, --and terminated by the output record separator. --.I file --and --.I cmd --may be literal names or parenthesized expressions; --identical string values in different statements denote --the same open file. --The --.B printf --statement formats its expression list according to the format --(see --.IR printf (3)) . --The built-in function --.BI close( expr ) --closes the file or pipe --.IR expr . --The built-in function --.BI fflush( expr ) --flushes any buffered output for the file or pipe --.IR expr . --.PP --The mathematical functions --.BR exp , --.BR log , --.BR sqrt , --.BR sin , --.BR cos , --and --.BR atan2 --are built in. --Other built-in functions: --.TF length --.TP --.B length --the length of its argument --taken as a string, --or of --.B $0 --if no argument. --.TP --.B rand --random number on (0,1) --.TP --.B srand --sets seed for --.B rand --and returns the previous seed. --.TP --.B int --truncates to an integer value --.TP --.BI substr( s , " m" , " n\fB) --the --.IR n -character --substring of --.I s --that begins at position --.IR m --counted from 1. --.TP --.BI index( s , " t" ) --the position in --.I s --where the string --.I t --occurs, or 0 if it does not. --.TP --.BI match( s , " r" ) --the position in --.I s --where the regular expression --.I r --occurs, or 0 if it does not. --The variables --.B RSTART --and --.B RLENGTH --are set to the position and length of the matched string. --.TP --.BI split( s , " a" , " fs\fB) --splits the string --.I s --into array elements --.IB a [1] , --.IB a [2] , --\&..., --.IB a [ n ] , --and returns --.IR n . --The separation is done with the regular expression --.I fs --or with the field separator --.B FS --if --.I fs --is not given. --An empty string as field separator splits the string --into one array element per character. --.TP --.BI sub( r , " t" , " s\fB) --substitutes --.I t --for the first occurrence of the regular expression --.I r --in the string --.IR s . --If --.I s --is not given, --.B $0 --is used. --.TP --.B gsub --same as --.B sub --except that all occurrences of the regular expression --are replaced; --.B sub --and --.B gsub --return the number of replacements. --.TP --.BI sprintf( fmt , " expr" , " ...\fB ) --the string resulting from formatting --.I expr ... --according to the --.IR printf (3) --format --.I fmt --.TP --.BI system( cmd ) --executes --.I cmd --and returns its exit status --.TP --.BI tolower( str ) --returns a copy of --.I str --with all upper-case characters translated to their --corresponding lower-case equivalents. --.TP --.BI toupper( str ) --returns a copy of --.I str --with all lower-case characters translated to their --corresponding upper-case equivalents. --.PD --.PP --The ``function'' --.B getline --sets --.B $0 --to the next input record from the current input file; --.B getline --.BI < file --sets --.B $0 --to the next record from --.IR file . --.B getline --.I x --sets variable --.I x --instead. --Finally, --.IB cmd " | getline --pipes the output of --.I cmd --into --.BR getline ; --each call of --.B getline --returns the next line of output from --.IR cmd . --In all cases, --.B getline --returns 1 for a successful input, --0 for end of file, and \-1 for an error. --.PP --Patterns are arbitrary Boolean combinations --(with --.BR "! || &&" ) --of regular expressions and --relational expressions. --Regular expressions are as in --.IR egrep ; --see --.IR grep (1). --Isolated regular expressions --in a pattern apply to the entire line. --Regular expressions may also occur in --relational expressions, using the operators --.BR ~ --and --.BR !~ . --.BI / re / --is a constant regular expression; --any string (constant or variable) may be used --as a regular expression, except in the position of an isolated regular expression --in a pattern. --.PP --A pattern may consist of two patterns separated by a comma; --in this case, the action is performed for all lines --from an occurrence of the first pattern --though an occurrence of the second. --.PP --A relational expression is one of the following: --.IP --.I expression matchop regular-expression --.br --.I expression relop expression --.br --.IB expression " in " array-name --.br --.BI ( expr , expr,... ") in " array-name --.PP --where a relop is any of the six relational operators in C, --and a matchop is either --.B ~ --(matches) --or --.B !~ --(does not match). --A conditional is an arithmetic expression, --a relational expression, --or a Boolean combination --of these. --.PP --The special patterns --.B BEGIN --and --.B END --may be used to capture control before the first input line is read --and after the last. --.B BEGIN --and --.B END --do not combine with other patterns. --.PP --Variable names with special meanings: --.TF FILENAME --.TP --.B CONVFMT --conversion format used when converting numbers --(default --.BR "%.6g" ) --.TP --.B FS --regular expression used to separate fields; also settable --by option --.BI \-F fs. --.TP --.BR NF --number of fields in the current record --.TP --.B NR --ordinal number of the current record --.TP --.B FNR --ordinal number of the current record in the current file --.TP --.B FILENAME --the name of the current input file --.TP --.B RS --input record separator (default newline) --.TP --.B OFS --output field separator (default blank) --.TP --.B ORS --output record separator (default newline) --.TP --.B OFMT --output format for numbers (default --.BR "%.6g" ) --.TP --.B SUBSEP --separates multiple subscripts (default 034) --.TP --.B ARGC --argument count, assignable --.TP --.B ARGV --argument array, assignable; --non-null members are taken as filenames --.TP --.B ENVIRON --array of environment variables; subscripts are names. --.PD --.PP --Functions may be defined (at the position of a pattern-action statement) thus: --.IP --.B --function foo(a, b, c) { ...; return x } --.PP --Parameters are passed by value if scalar and by reference if array name; --functions may be called recursively. --Parameters are local to the function; all other variables are global. --Thus local variables may be created by providing excess parameters in --the function definition. --.SH EXAMPLES --.TP --.EX --length($0) > 72 --.EE --Print lines longer than 72 characters. --.TP --.EX --{ print $2, $1 } --.EE --Print first two fields in opposite order. --.PP --.EX --BEGIN { FS = ",[ \et]*|[ \et]+" } -- { print $2, $1 } --.EE --.ns --.IP --Same, with input fields separated by comma and/or blanks and tabs. --.PP --.EX --.nf -- { s += $1 } --END { print "sum is", s, " average is", s/NR } --.fi --.EE --.ns --.IP --Add up first column, print sum and average. --.TP --.EX --/start/, /stop/ --.EE --Print all lines between start/stop pairs. --.PP --.EX --.nf --BEGIN { # Simulate echo(1) -- for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i] -- printf "\en" -- exit } --.fi --.EE --.SH SEE ALSO --.IR lex (1), --.IR sed (1) --.br --A. V. Aho, B. W. Kernighan, P. J. Weinberger, --.I --The AWK Programming Language, --Addison-Wesley, 1988. ISBN 0-201-07981-X --.SH BUGS --There are no explicit conversions between numbers and strings. --To force an expression to be treated as a number add 0 to it; --to force it to be treated as a string concatenate --\&\f(CW""\fP to it. --.br --The scope rules for variables in functions are a botch; --the syntax is worse. -//GO.SYSIN DD awk.1 diff --git a/dist/nawk/maketab b/dist/nawk/maketab Binary files differdeleted file mode 100755 index f8518a7faa4..00000000000 --- a/dist/nawk/maketab +++ /dev/null diff --git a/dist/nawk/vcvars32.bat b/dist/nawk/vcvars32.bat deleted file mode 100644 index c3be8ed992a..00000000000 --- a/dist/nawk/vcvars32.bat +++ /dev/null @@ -1,33 +0,0 @@ -@echo off
-rem
-rem Root of Visual Developer Studio Common files.
-set VSCommonDir=C:\PROGRA~1\MICROS~3\Common
-
-rem
-rem Root of Visual Developer Studio installed files.
-rem
-set MSDevDir=C:\PROGRA~1\MICROS~3\Common\msdev98
-
-rem
-rem Root of Visual C++ installed files.
-rem
-set MSVCDir=C:\PROGRA~1\MICROS~3\VC98
-
-rem
-rem VcOsDir is used to help create either a Windows 95 or Windows NT specific path.
-rem
-set VcOsDir=WIN95
-if "%OS%" == "Windows_NT" set VcOsDir=WINNT
-
-rem
-echo Setting environment for using Microsoft Visual C++ tools.
-rem
-
-if "%OS%" == "Windows_NT" set PATH=%MSDevDir%\BIN;%MSVCDir%\BIN;%VSCommonDir%\TOOLS\%VcOsDir%;%VSCommonDir%\TOOLS;%PATH%
-if "%OS%" == "" set PATH="%MSDevDir%\BIN";"%MSVCDir%\BIN";"%VSCommonDir%\TOOLS\%VcOsDir%";"%VSCommonDir%\TOOLS";"%windir%\SYSTEM";"%PATH%"
-set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%
-set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%
-
-set VcOsDir=
-set VSCommonDir=
-
|
