summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjdolecek <jdolecek@NetBSD.org>2005-07-02 18:58:15 +0000
committerjdolecek <jdolecek@NetBSD.org>2005-07-02 18:58:15 +0000
commit5a4553e7263db932b7822669cbbd05cb75c366ca (patch)
treea1011bf9432d0dcab3ae7551a8aa2cf73149deee
parente5687f9fff78b0c1c42303f0c8af689432934e38 (diff)
this should not have been committed, sorry
-rw-r--r--dist/nawk/awk.shar15355
-rwxr-xr-xdist/nawk/maketabbin8935 -> 0 bytes
-rw-r--r--dist/nawk/vcvars32.bat33
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
deleted file mode 100755
index f8518a7faa4..00000000000
--- a/dist/nawk/maketab
+++ /dev/null
Binary files differ
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=
-