gawk-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gawk-diffs] [SCM] gawk branch, master, updated. 73d24cae0db6cc817db209e


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, master, updated. 73d24cae0db6cc817db209e5e1ea93b0733d1cca
Date: Mon, 26 Dec 2011 21:40:18 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".

The branch, master has been updated
       via  73d24cae0db6cc817db209e5e1ea93b0733d1cca (commit)
       via  14828f8fd6f90f711d832f2c4d7120db4bef3770 (commit)
       via  a32faf6354086864b55755c968f72a90e7e8f0d1 (commit)
       via  9229cd0e900ab31d1049eda623f2756670109399 (commit)
      from  0130721d02a7410c3291c4704be69ccc4078ff3e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=73d24cae0db6cc817db209e5e1ea93b0733d1cca

commit 73d24cae0db6cc817db209e5e1ea93b0733d1cca
Author: Arnold D. Robbins <address@hidden>
Date:   Mon Dec 26 23:39:48 2011 +0200

    The grand merge: dgawk and pgawk folded into gawk.

diff --git a/ChangeLog b/ChangeLog
index 8945a6b..9999d8b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,53 @@
+2011-12-26         John Haque      <address@hidden>
+
+       Merge gawk, pgawk and dgawk into a single executable gawk.
+
+       * awk.h (DO_PRETTY_PRINT, DO_PROFILE, DO_DEBUG,
+       do_pretty_print, do_debug): New defines.
+       (interpret): New variable, a pointer to an interpreter routine.
+       (enum exe_mode): Nuked.
+       * main.c (opttab): New options --pretty-print and --debug;
+       Remove option --command.
+       (usage): Update usage messages.
+       * interpret.h: New file.
+       * eval.c (r_interpret): Move to the new file.
+       (debug_interpret): New interpreter routine when debugging.
+       (init_interpret): New routine to initialize interpreter related
+       variables.
+       * eval_d.c, eval_p.c: Delete files.
+       * debug.c (interpret): Renamed to debug_prog.
+       (DEFAULT_PROMPT, DEFAULT_HISTFILE, DEFAULT_OPTFILE): Remove prefix 'd'.
+       * profile.c (init_profiling): Nuked.
+       * Makefile.am: Adjusted.
+
+       Add command line option --load for loading extensions.
+
+       * awk.h (srctype): Add new source type SRC_EXTLIB.
+       * ext.c(load_ext): New routine to load extension.
+       (do_ext): Adjust to use load_ext().
+       * main.c (opttab): Add new option --load.
+       (main): Call load_ext() to load extensions.
+       (usage): Add usage message for the new option.
+       * io.c (get_cwd): New routine.
+       (do_find_source): Use the new routine.
+       (find_source): Handle new type SRC_EXTLIB.
+       * awkgram.y (parse_program, next_sourcefile): Skip type SRC_EXTLIB.
+       (add_srcfile): Adjust call to find_source.
+       * debug.c (source_find): Same.
+
+       Unrelated:
+
+       * ext.c (get_argument): Fixed argument parsing.
+       * array.c (null_array_func): Reworked array routines for an empty array.
+       * str_array.c, int_array.c: Make GCC happy, use %u instead of %lu
+       printf formats.
+       * eval.c (node_Boolean): New array for TRUE and FALSE nodes.
+       (init_interpret): Create the new nodes.
+       (eval_condition): Add test for the new nodes.
+       (setup_frame): Disable tail-recursion optimization when profiling.
+       * interpret.h (r_interpret): Use the boolean nodes instead of making
+       new ones when needed.
+
 2011-12-26         Arnold D. Robbins     <address@hidden>
 
        Finish Rational Range Interpretation (!)
diff --git a/Makefile.am b/Makefile.am
index e924850..b947061 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -79,18 +79,22 @@ SUBDIRS = \
        test
 
 # what to make and install
-bin_PROGRAMS = gawk pgawk dgawk
+bin_PROGRAMS = gawk
 
-# sources for both gawk and pgawk
+# sources for both gawk and dgawk
 base_sources = \
        array.c \
        awk.h \
        awkgram.y \
        builtin.c \
        cint_array.c \
+       cmd.h \
+       command.y \
        custom.h \
+       debug.c \
        dfa.c \
        dfa.h \
+       eval.c \
        ext.c \
        field.c \
        floatcomp.c \
@@ -102,11 +106,13 @@ base_sources = \
        getopt_int.h \
        gettext.h \
        int_array.c \
+       interpret.h \
        io.c \
        mbsupport.h \
        main.c \
        msg.c \
        node.c \
+       profile.c \
        protos.h \
        random.c \
        random.h \
@@ -119,13 +125,10 @@ base_sources = \
        version.c \
        xalloc.h
 
-gawk_SOURCES = $(base_sources) eval.c profile.c
-pgawk_SOURCES = $(base_sources) eval_p.c profile_p.c
-dgawk_SOURCES = $(base_sources) eval_d.c profile.c cmd.h command.y debug.c
+gawk_SOURCES = $(base_sources)
 
 # Get extra libs as needed, Automake will supply LIBINTL and SOCKET_LIBS.
-LDADD = $(LIBSIGSEGV) $(LIBINTL) $(SOCKET_LIBS)
-dgawk_LDADD = $(LDADD) @LIBREADLINE@
+LDADD = $(LIBSIGSEGV) $(LIBINTL) $(SOCKET_LIBS) @LIBREADLINE@
 
 # Directory for gawk's data files. Automake supplies datadir.
 pkgdatadir = $(datadir)/awk
@@ -144,7 +147,6 @@ MAINTAINERCLEANFILES = version.c
 LN= ln
 
 # First, add a link from gawk to gawk-X.Y.Z.
-# Same for pgawk.
 #
 # For GNU systems where gawk is awk, add a link to awk.
 # (This is done universally, which may not always be right, but
@@ -152,7 +154,6 @@ LN= ln
 install-exec-hook:
        (cd $(DESTDIR)$(bindir); \
        $(LN) gawk$(EXEEXT) gawk-$(VERSION)$(EXEEXT) 2>/dev/null ; \
-       $(LN) pgawk$(EXEEXT) pgawk-$(VERSION)$(EXEEXT) 2>/dev/null ; \
        if [ ! -f awk ]; \
        then    $(LN_S) gawk$(EXEEXT) awk; \
        fi; exit 0)
@@ -161,12 +162,12 @@ install-exec-hook:
 uninstall-links:
        (cd $(DESTDIR)$(bindir); \
        if [ -f awk ] && cmp awk gawk$(EXEEXT) > /dev/null; then rm -f awk; fi 
; \
-       rm -f gawk-$(VERSION)$(EXEEXT) pgawk-$(VERSION)$(EXEEXT); exit 0)
+       rm -f gawk-$(VERSION)$(EXEEXT); exit 0)
 
 uninstall-recursive: uninstall-links
 
 # force there to be a gawk executable before running tests
-check-local: gawk$(EXEEXT) pgawk$(EXEEXT)
+check-local: gawk$(EXEEXT)
 
 # A little extra clean up when making distributions.
 # And additional set up for the pc directory.
@@ -181,6 +182,7 @@ dist-hook:
 # Special rules for individual files
 # Use of awk instead of $(AWK) is deliberate, in case gawk doesn't build
 # or work correctly.
+
 awkgram.c: awkgram.y
        $(YACC) $(AM_YFLAGS) $(YFLAGS) $<
        sed 's/parse error/syntax error/g' < y.tab.c | awk -f 
$(srcdir)/bisonfix.awk awkgram > $*.c && rm y.tab.c
diff --git a/Makefile.in b/Makefile.in
index 26d6017..3083c4c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -56,7 +56,7 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-bin_PROGRAMS = gawk$(EXEEXT) pgawk$(EXEEXT) dgawk$(EXEEXT)
+bin_PROGRAMS = gawk$(EXEEXT)
 subdir = .
 DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in $(srcdir)/configh.in \
@@ -88,31 +88,20 @@ CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
 am__objects_1 = array.$(OBJEXT) awkgram.$(OBJEXT) builtin.$(OBJEXT) \
-       cint_array.$(OBJEXT) dfa.$(OBJEXT) ext.$(OBJEXT) \
-       field.$(OBJEXT) floatcomp.$(OBJEXT) gawkmisc.$(OBJEXT) \
-       getopt.$(OBJEXT) getopt1.$(OBJEXT) int_array.$(OBJEXT) \
-       io.$(OBJEXT) main.$(OBJEXT) msg.$(OBJEXT) node.$(OBJEXT) \
+       cint_array.$(OBJEXT) command.$(OBJEXT) debug.$(OBJEXT) \
+       dfa.$(OBJEXT) eval.$(OBJEXT) ext.$(OBJEXT) field.$(OBJEXT) \
+       floatcomp.$(OBJEXT) gawkmisc.$(OBJEXT) getopt.$(OBJEXT) \
+       getopt1.$(OBJEXT) int_array.$(OBJEXT) io.$(OBJEXT) \
+       main.$(OBJEXT) msg.$(OBJEXT) node.$(OBJEXT) profile.$(OBJEXT) \
        random.$(OBJEXT) re.$(OBJEXT) regex.$(OBJEXT) \
        replace.$(OBJEXT) str_array.$(OBJEXT) symbol.$(OBJEXT) \
        version.$(OBJEXT)
-am_dgawk_OBJECTS = $(am__objects_1) eval_d.$(OBJEXT) profile.$(OBJEXT) \
-       command.$(OBJEXT) debug.$(OBJEXT)
-dgawk_OBJECTS = $(am_dgawk_OBJECTS)
-am__DEPENDENCIES_1 =
-am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-       $(am__DEPENDENCIES_1)
-dgawk_DEPENDENCIES = $(am__DEPENDENCIES_2)
-am_gawk_OBJECTS = $(am__objects_1) eval.$(OBJEXT) profile.$(OBJEXT)
+am_gawk_OBJECTS = $(am__objects_1)
 gawk_OBJECTS = $(am_gawk_OBJECTS)
 gawk_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
 gawk_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1)
-am_pgawk_OBJECTS = $(am__objects_1) eval_p.$(OBJEXT) \
-       profile_p.$(OBJEXT)
-pgawk_OBJECTS = $(am_pgawk_OBJECTS)
-pgawk_LDADD = $(LDADD)
-pgawk_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-       $(am__DEPENDENCIES_1)
 DEFAULT_INCLUDES = address@hidden@
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
@@ -123,8 +112,8 @@ CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
 YLWRAP = $(top_srcdir)/ylwrap
-SOURCES = $(dgawk_SOURCES) $(gawk_SOURCES) $(pgawk_SOURCES)
-DIST_SOURCES = $(dgawk_SOURCES) $(gawk_SOURCES) $(pgawk_SOURCES)
+SOURCES = $(gawk_SOURCES)
+DIST_SOURCES = $(gawk_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        html-recursive info-recursive install-data-recursive \
        install-dvi-recursive install-exec-recursive \
@@ -357,16 +346,20 @@ SUBDIRS = \
        test
 
 
-# sources for both gawk and pgawk
+# sources for both gawk and dgawk
 base_sources = \
        array.c \
        awk.h \
        awkgram.y \
        builtin.c \
        cint_array.c \
+       cmd.h \
+       command.y \
        custom.h \
+       debug.c \
        dfa.c \
        dfa.h \
+       eval.c \
        ext.c \
        field.c \
        floatcomp.c \
@@ -378,11 +371,13 @@ base_sources = \
        getopt_int.h \
        gettext.h \
        int_array.c \
+       interpret.h \
        io.c \
        mbsupport.h \
        main.c \
        msg.c \
        node.c \
+       profile.c \
        protos.h \
        random.c \
        random.h \
@@ -395,13 +390,10 @@ base_sources = \
        version.c \
        xalloc.h
 
-gawk_SOURCES = $(base_sources) eval.c profile.c
-pgawk_SOURCES = $(base_sources) eval_p.c profile_p.c
-dgawk_SOURCES = $(base_sources) eval_d.c profile.c cmd.h command.y debug.c
+gawk_SOURCES = $(base_sources)
 
 # Get extra libs as needed, Automake will supply LIBINTL and SOCKET_LIBS.
-LDADD = $(LIBSIGSEGV) $(LIBINTL) $(SOCKET_LIBS)
-dgawk_LDADD = $(LDADD) @LIBREADLINE@
+LDADD = $(LIBSIGSEGV) $(LIBINTL) $(SOCKET_LIBS) @LIBREADLINE@
 
 # stuff for compiling gawk/pgawk
 DEFPATH = '".$(PATH_SEPARATOR)$(pkgdatadir)"'
@@ -505,15 +497,9 @@ uninstall-binPROGRAMS:
 
 clean-binPROGRAMS:
        -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-dgawk$(EXEEXT): $(dgawk_OBJECTS) $(dgawk_DEPENDENCIES) 
-       @rm -f dgawk$(EXEEXT)
-       $(LINK) $(dgawk_OBJECTS) $(dgawk_LDADD) $(LIBS)
 gawk$(EXEEXT): $(gawk_OBJECTS) $(gawk_DEPENDENCIES) 
        @rm -f gawk$(EXEEXT)
        $(LINK) $(gawk_OBJECTS) $(gawk_LDADD) $(LIBS)
-pgawk$(EXEEXT): $(pgawk_OBJECTS) $(pgawk_DEPENDENCIES) 
-       @rm -f pgawk$(EXEEXT)
-       $(LINK) $(pgawk_OBJECTS) $(pgawk_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -529,8 +515,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
address@hidden@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
address@hidden@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
@@ -543,7 +527,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
address@hidden@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
 @AMDEP_TRUE@@am__include@ @address@hidden/$(DEPDIR)/address@hidden@
@@ -1017,7 +1000,6 @@ uninstall-am: uninstall-binPROGRAMS
 
 
 # First, add a link from gawk to gawk-X.Y.Z.
-# Same for pgawk.
 #
 # For GNU systems where gawk is awk, add a link to awk.
 # (This is done universally, which may not always be right, but
@@ -1025,7 +1007,6 @@ uninstall-am: uninstall-binPROGRAMS
 install-exec-hook:
        (cd $(DESTDIR)$(bindir); \
        $(LN) gawk$(EXEEXT) gawk-$(VERSION)$(EXEEXT) 2>/dev/null ; \
-       $(LN) pgawk$(EXEEXT) pgawk-$(VERSION)$(EXEEXT) 2>/dev/null ; \
        if [ ! -f awk ]; \
        then    $(LN_S) gawk$(EXEEXT) awk; \
        fi; exit 0)
@@ -1034,12 +1015,12 @@ install-exec-hook:
 uninstall-links:
        (cd $(DESTDIR)$(bindir); \
        if [ -f awk ] && cmp awk gawk$(EXEEXT) > /dev/null; then rm -f awk; fi 
; \
-       rm -f gawk-$(VERSION)$(EXEEXT) pgawk-$(VERSION)$(EXEEXT); exit 0)
+       rm -f gawk-$(VERSION)$(EXEEXT); exit 0)
 
 uninstall-recursive: uninstall-links
 
 # force there to be a gawk executable before running tests
-check-local: gawk$(EXEEXT) pgawk$(EXEEXT)
+check-local: gawk$(EXEEXT)
 
 # A little extra clean up when making distributions.
 # And additional set up for the pc directory.
@@ -1054,6 +1035,7 @@ dist-hook:
 # Special rules for individual files
 # Use of awk instead of $(AWK) is deliberate, in case gawk doesn't build
 # or work correctly.
+
 awkgram.c: awkgram.y
        $(YACC) $(AM_YFLAGS) $(YFLAGS) $<
        sed 's/parse error/syntax error/g' < y.tab.c | awk -f 
$(srcdir)/bisonfix.awk awkgram > $*.c && rm y.tab.c
diff --git a/NEWS b/NEWS
index 289ce86..1485501 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,17 @@
    Copying and distribution of this file, with or without modification,
    are permitted in any medium without royalty provided the copyright
    notice and this notice are preserved.
+
+Changes from 4.0.1 to 4.1
+-------------------------
+1. The three executables gawk, pgawk, and dgawk, have been merged into
+   one, named just gawk.  As a result:
+       * The -R option is gone
+       * Use -D ...
+       * Use -o ...
+       * Use -p ...
+
+2. The new -l option is used for loading dynamic extensions.
  
 Changes from 4.0.0 to 4.0.1
 ---------------------------
diff --git a/array.c b/array.c
index 90679b7..e3bdbf5 100644
--- a/array.c
+++ b/array.c
@@ -35,11 +35,22 @@ static size_t SUBSEPlen;
 static char *SUBSEP;
 static char indent_char[] = "    ";
 
-static NODE **e_lookup(NODE *symbol, NODE *subs);
-static array_ptr empty_array_func[NUM_AFUNCS] = {
+static NODE **null_lookup(NODE *symbol, NODE *subs);
+static NODE **null_afunc(NODE *symbol, NODE *subs);
+static NODE **null_dump(NODE *symbol, NODE *subs);
+static array_ptr null_array_func[] = {
        (array_ptr) 0,
        (array_ptr) 0,
-       e_lookup,
+       null_lookup,
+       null_afunc,
+       null_afunc,
+       null_afunc,
+       null_afunc,
+       null_afunc,
+       null_dump,
+#ifdef ARRAYDEBUG
+       null_afunc
+#endif
 };
 
 #define MAX_ATYPE 10
@@ -91,20 +102,20 @@ make_array()
        getnode(array);
        memset(array, '\0', sizeof(NODE));
        array->type = Node_var_array;
-       array->array_funcs = empty_array_func;
+       array->array_funcs = null_array_func;
        /* vname, flags, and parent_array not set here */
 
        return array;
 }              
 
 
-/* init_array --- initialize an array node */
+/* init_array --- (re)initialize an array node */
 
 void
 init_array(NODE *symbol)
 {
        symbol->type = Node_var_array;
-       symbol->array_funcs = empty_array_func;
+       symbol->array_funcs = null_array_func;
        symbol->buckets = NULL;
        symbol->table_size = symbol->array_size = 0;
        symbol->array_capacity = 0;
@@ -116,15 +127,15 @@ init_array(NODE *symbol)
 }
 
 
-/* e_lookup: assign type to an empty array. */
+/* null_lookup: assign type to an empty array. */
 
 static NODE **
-e_lookup(NODE *symbol, NODE *subs)
+null_lookup(NODE *symbol, NODE *subs)
 {
        int i;
        array_ptr *afunc = NULL;
 
-       assert(array_empty(symbol) == TRUE);
+       assert(symbol->table_size == 0);
 
        /* Check which array type wants to accept this sub; traverse
         * array type list in reverse order.
@@ -143,13 +154,21 @@ e_lookup(NODE *symbol, NODE *subs)
 }
 
 
-/* assoc_clear --- flush all the values in symbol[] */
+/* null_afunc --- dummy function for an empty array */
 
-void
-assoc_clear(NODE *symbol)
+static NODE **
+null_afunc(NODE *symbol ATTRIBUTE_UNUSED, NODE *subs ATTRIBUTE_UNUSED)
 {
-       if (! array_empty(symbol))
-               (void) symbol->aclear(symbol, NULL);
+       return NULL;
+}
+
+/* null_dump --- dump function for an empty array */
+
+static NODE **
+null_dump(NODE *symbol, NODE *subs ATTRIBUTE_UNUSED)
+{
+       fprintf(output_fp, "array `%s' is empty\n", array_vname(symbol));
+       return NULL;
 }
 
 
@@ -162,24 +181,11 @@ r_in_array(NODE *symbol, NODE *subs)
 {
        NODE **ret;
 
-       if (array_empty(symbol))
-               return NULL;
        ret = symbol->aexists(symbol, subs);
        return (ret ? *ret : NULL);
 }
 
 
-/* assoc_remove --- remove an index from symbol[] */
-
-int
-assoc_remove(NODE *symbol, NODE *subs)
-{
-       if (array_empty(symbol))
-               return FALSE;
-       return (symbol->aremove(symbol, subs) != NULL);
-}
-
-
 /* assoc_copy --- duplicate input array "symbol" */
 
 NODE *
@@ -188,11 +194,9 @@ assoc_copy(NODE *symbol, NODE *newsymb)
        assert(newsymb->vname != NULL);
 
        assoc_clear(newsymb);
-       if (! array_empty(symbol)) {
-               (void) symbol->acopy(symbol, newsymb);
-               newsymb->array_funcs = symbol->array_funcs;
-               newsymb->flags = symbol->flags;
-       }
+       (void) symbol->acopy(symbol, newsymb);
+       newsymb->array_funcs = symbol->array_funcs;
+       newsymb->flags = symbol->flags;
        return newsymb;
 }
 
@@ -202,9 +206,7 @@ assoc_copy(NODE *symbol, NODE *newsymb)
 void
 assoc_dump(NODE *symbol, NODE *ndump)
 {
-       if (array_empty(symbol))
-               fprintf(output_fp, "array `%s' is empty\n", 
array_vname(symbol));
-       else if (symbol->adump) 
+       if (symbol->adump)      
                (void) symbol->adump(symbol, ndump);
 }
 
@@ -806,7 +808,7 @@ asort_actual(int nargs, SORT_CTXT ctxt)
 {
        NODE *array, *dest = NULL, *result;
        NODE *r, *subs, *s;
-       NODE **list, **ptr;
+       NODE **list = NULL, **ptr;
        unsigned long num_elems, i;
        const char *sort_str;
 
@@ -855,18 +857,18 @@ asort_actual(int nargs, SORT_CTXT ctxt)
                }
        }
 
-       if (array_empty(array)) {
-               /* source array is empty */
-               if (dest != NULL && dest != array)
-                       assoc_clear(dest);
-               return make_number((AWKNUM) 0);
-       }
        num_elems = array->table_size;
-
-       /* sorting happens inside assoc_list */
-       list = assoc_list(array, sort_str, ctxt);
+       if (num_elems > 0)      /* sorting happens inside assoc_list */
+               list = assoc_list(array, sort_str, ctxt);
        DEREF(s);
 
+       if (num_elems == 0 || list == NULL) {
+               /* source array is empty */
+               if (dest != NULL && dest != array)
+                       assoc_clear(dest);
+               return make_number((AWKNUM) 0);
+       }
+
        /*
         * Must not assoc_clear() the source array before constructing
         * the output array. assoc_list() does not duplicate array values
@@ -1241,7 +1243,7 @@ sort_user_func(const void *p1, const void *p2)
        PUSH(val2);
 
        /* execute the comparison function */
-       (void) interpret(code);
+       (void) (*interpret)(code);
 
        /* return value of the comparison function */
        POP_NUMBER(ret);
@@ -1289,7 +1291,8 @@ assoc_list(NODE *symbol, const char *sort_str, SORT_CTXT 
sort_ctxt)
        int save_rule = 0;
        
        num_elems = symbol->table_size;
-       assert(num_elems > 0);
+       if (num_elems == 0)
+               return NULL;
 
        elem_size = 1;
        fl.flags = 0;
@@ -1355,8 +1358,8 @@ assoc_list(NODE *symbol, const char *sort_str, SORT_CTXT 
sort_ctxt)
 
        list = symbol->alist(symbol, & fl);
 
-       if (! cmp_func || (fl.flags & (AASC|ADESC)) != 0)
-               return list;    /* unsorted or list already sorted */
+       if (list == NULL || ! cmp_func || (fl.flags & (AASC|ADESC)) != 0)
+               return list;    /* empty list or unsorted, or list already 
sorted */
 
        qsort(list, num_elems, elem_size * sizeof(NODE *), cmp_func); /* 
shazzam! */
 
@@ -1367,9 +1370,7 @@ assoc_list(NODE *symbol, const char *sort_str, SORT_CTXT 
sort_ctxt)
                bcfree(code);                   /* Op_func_call */
        }
 
-       if (sort_ctxt == SORTED_IN
-               && (fl.flags & (AINDEX|AVALUE)) == (AINDEX|AVALUE)
-       ) {
+       if (sort_ctxt == SORTED_IN && (fl.flags & (AINDEX|AVALUE)) == 
(AINDEX|AVALUE)) {
                /* relocate all index nodes to the first half of the list. */
                for (j = 1; j < num_elems; j++)
                        list[j] = list[2 * j];
diff --git a/awk.h b/awk.h
index a430111..a7747b9 100644
--- a/awk.h
+++ b/awk.h
@@ -407,7 +407,7 @@ typedef struct exp_node {
 #              define  ARRAYMAXED      0x0800       /* array is at max size */
 #              define  HALFHAT         0x1000       /* half-capacity Hashed 
Array Tree;
                                                      * See cint_array.c */
-#              define  XARRAY          0x2000       /* FIXME: Nuke */
+#              define  XARRAY          0x2000
 } NODE;
 
 #define vname sub.nodep.name
@@ -901,8 +901,8 @@ typedef struct srcfile {
        struct srcfile *next;
        struct srcfile *prev;
 
-       enum srctype { SRC_CMDLINE = 1, SRC_STDIN, SRC_FILE, SRC_INC } stype;
-       char *src;      /* name on command line or inclde statement */
+       enum srctype { SRC_CMDLINE = 1, SRC_STDIN, SRC_FILE, SRC_INC, 
SRC_EXTLIB } stype;
+       char *src;      /* name on command line or include statement */
        char *fullpath; /* full path after AWKPATH search */
        time_t mtime;
        struct stat sbuf;
@@ -990,6 +990,8 @@ extern NODE *Null_field;
 extern NODE **fields_arr;
 extern int sourceline;
 extern char *source;
+extern int (*interpret)(INSTRUCTION *);        /* interpreter routine */
+
 
 #if __GNUC__ < 2
 extern NODE *_t;       /* used as temporary in macros */
@@ -1017,25 +1019,31 @@ extern int do_flags;
 #define DO_NON_DEC_DATA 0x0040
 /* allow {...,...} in regexps, see resetup() */
 #define DO_INTERVALS    0x0080
-/* profile and pretty print the program */
-#define DO_PROFILING    0x0100
+/* pretty print the program */
+#define DO_PRETTY_PRINT        0x0100
 /* dump all global variables at end */
 #define DO_DUMP_VARS    0x0200
 /* release vars when done */
 #define        DO_TIDY_MEM     0x0400
 /* sandbox mode - disable 'system' function & redirections */
 #define DO_SANDBOX      0x0800
+/* profile the program */
+#define DO_PROFILE     0x1000
+/* debug the program */
+#define DO_DEBUG       0x2000
 
 
 #define do_traditional      (do_flags & DO_TRADITIONAL)
-#define        do_posix            (do_flags & DO_POSIX)
-#define        do_intl             (do_flags & DO_INTL)
+#define do_posix            (do_flags & DO_POSIX)
+#define do_intl             (do_flags & DO_INTL)
 #define do_non_decimal_data (do_flags & DO_NON_DEC_DATA)
 #define do_intervals        (do_flags & DO_INTERVALS)
-#define        do_profiling        (do_flags & DO_PROFILING)
+#define do_pretty_print     (do_flags & DO_PRETTY_PRINT)
+#define do_profile          (do_flags & DO_PROFILE)
 #define do_dump_vars        (do_flags & DO_DUMP_VARS)
 #define do_tidy_mem         (do_flags & DO_TIDY_MEM)
 #define do_sandbox          (do_flags & DO_SANDBOX)
+#define do_debug            (do_flags & DO_DEBUG)
 
 
 extern int do_optimize;
@@ -1073,17 +1081,10 @@ extern char envsep;
 
 extern char casetable[];       /* for case-independent regexp matching */
 
-/*
- * Provide a way for code to know which program is executing:
- * gawk vs dgawk vs pgawk.
- */
-enum exe_mode { exe_normal = 1, exe_debugging, exe_profiling };
-extern enum exe_mode which_gawk;       /* (defined in eval.c) */
-
 /* ------------------------- Runtime stack -------------------------------- */
 
 typedef union stack_item {
-       NODE *rptr;             /* variable etc. */
+       NODE *rptr;     /* variable etc. */
        NODE **lptr;    /* address of a variable etc. */
 } STACK_ITEM;
 
@@ -1246,15 +1247,21 @@ extern int fatal_tag_valid;
 if (val++) \
        memcpy((char *) (stack), (const char *) tag, sizeof(jmp_buf))
 #define POP_BINDING(stack, tag, val)   \
-if (--val)     \
+if (--val) \
        memcpy((char *) tag, (const char *) (stack), sizeof(jmp_buf))
 
 #define array_empty(a) ((a)->table_size == 0)
 #define assoc_lookup(a, s)     (a)->alookup(a, s)
 
+/* assoc_clear --- flush all the values in symbol[] */
+#define assoc_clear(a) (void) ((a)->aclear(a, NULL))
+
+/* assoc_remove --- remove an index from symbol[] */
+#define assoc_remove(a, s) ((a)->aremove(a, s) != NULL)
+
+
 #if __GNUC__ >= 2
-#define in_array(a, s) ({ NODE **_l; array_empty(a) ? NULL \
-                       : (_l = (a)->aexists(a, s), _l ? *_l : NULL); })
+#define in_array(a, s) ({ NODE **_l; _l = (a)->aexists(a, s); _l ? *_l : NULL; 
})
 #else /* not __GNUC__ */
 #define in_array(a, s) r_in_array(a, s)
 #endif /* __GNUC__ */
@@ -1284,9 +1291,7 @@ extern void array_init(void);
 extern int register_array_func(array_ptr *afunc);
 extern void set_SUBSEP(void);
 extern NODE *concat_exp(int nargs, int do_subsep);
-extern void assoc_clear(NODE *symbol);
 extern NODE *r_in_array(NODE *symbol, NODE *subs);
-extern int assoc_remove(NODE *symbol, NODE *subs);
 extern NODE *assoc_copy(NODE *symbol, NODE *newsymb);
 extern void assoc_dump(NODE *symbol, NODE *p);
 extern NODE **assoc_list(NODE *symbol, const char *sort_str, SORT_CTXT 
sort_ctxt);
@@ -1358,7 +1363,9 @@ extern int strncasecmpmbs(const unsigned char *,
 /* eval.c */
 extern void PUSH_CODE(INSTRUCTION *cp);
 extern INSTRUCTION *POP_CODE(void);
-extern int interpret(INSTRUCTION *);
+extern void init_interpret(void);
+extern int r_interpret(INSTRUCTION *);
+extern int debug_interpret(INSTRUCTION *);
 extern int cmp_nodes(NODE *p1, NODE *p2);
 extern void set_IGNORECASE(void);
 extern void set_OFS(void);
@@ -1384,11 +1391,10 @@ extern const char *opcode2str(OPCODE type);
 extern const char *op2str(OPCODE type);
 extern NODE **r_get_lhs(NODE *n, int reference);
 extern STACK_ITEM *grow_stack(void);
-#ifdef PROFILING
 extern void dump_fcall_stack(FILE *fp);
-#endif
 /* ext.c */
 NODE *do_ext(int nargs);
+NODE *load_ext(const char *lib_name, const char *init_func, NODE *obj);
 #ifdef DYNAMIC
 void make_builtin(const char *, NODE *(*)(int), int);
 NODE *get_argument(int);
@@ -1443,7 +1449,7 @@ extern int flush_io(void);
 extern int close_io(int *stdio_problem);
 extern int devopen(const char *name, const char *mode);
 extern int srcopen(SRCFILE *s);
-extern char *find_source(const char *src, struct stat *stb, int *errcode);
+extern char *find_source(const char *src, struct stat *stb, int *errcode, int 
is_extlib);
 extern NODE *do_getline_redir(int intovar, int redirtype);
 extern NODE *do_getline(int intovar, IOBUF *iop);
 extern struct redirect *getredirect(const char *str, int len);
diff --git a/awkgram.c b/awkgram.c
index 32a4b66..5eff6e3 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -173,6 +173,7 @@ extern int sourceline;
 extern SRCFILE *srcfiles;
 extern INSTRUCTION *rule_list;
 extern int max_args;
+extern NODE **args_array;
 
 static INSTRUCTION *rule_block[sizeof(ruletab)];
 
@@ -194,7 +195,7 @@ extern double fmod(double x, double y);
 
 
 /* Line 268 of yacc.c  */
-#line 198 "awkgram.c"
+#line 199 "awkgram.c"
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -340,7 +341,7 @@ typedef int YYSTYPE;
 
 
 /* Line 343 of yacc.c  */
-#line 344 "awkgram.c"
+#line 345 "awkgram.c"
 
 #ifdef short
 # undef short
@@ -702,25 +703,25 @@ static const yytype_int16 yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   191,   191,   193,   198,   199,   203,   215,   219,   230,
-     236,   244,   252,   254,   260,   261,   263,   289,   300,   311,
-     317,   326,   336,   338,   340,   346,   351,   352,   356,   375,
-     374,   408,   410,   415,   416,   429,   434,   435,   439,   441,
-     443,   450,   540,   582,   624,   737,   744,   751,   761,   770,
-     779,   788,   803,   819,   818,   842,   854,   854,   948,   948,
-     973,   996,  1002,  1003,  1009,  1010,  1017,  1022,  1034,  1048,
-    1050,  1056,  1061,  1063,  1071,  1073,  1082,  1083,  1091,  1096,
-    1096,  1107,  1111,  1119,  1120,  1123,  1125,  1130,  1131,  1140,
-    1141,  1146,  1151,  1157,  1159,  1161,  1168,  1169,  1175,  1176,
-    1181,  1183,  1188,  1190,  1192,  1194,  1200,  1207,  1209,  1211,
-    1227,  1237,  1244,  1246,  1251,  1253,  1255,  1263,  1265,  1270,
-    1272,  1277,  1279,  1281,  1331,  1333,  1335,  1337,  1339,  1341,
-    1343,  1345,  1368,  1373,  1378,  1403,  1409,  1411,  1413,  1415,
-    1417,  1419,  1424,  1428,  1459,  1461,  1467,  1473,  1486,  1487,
-    1488,  1493,  1498,  1502,  1506,  1519,  1532,  1537,  1573,  1591,
-    1592,  1598,  1599,  1604,  1606,  1613,  1630,  1647,  1649,  1656,
-    1661,  1669,  1679,  1691,  1700,  1704,  1708,  1712,  1716,  1720,
-    1723,  1725,  1729,  1733,  1737
+       0,   192,   192,   194,   199,   200,   204,   216,   220,   231,
+     237,   245,   253,   255,   261,   262,   264,   290,   301,   312,
+     318,   327,   337,   339,   341,   347,   352,   353,   357,   376,
+     375,   409,   411,   416,   417,   430,   435,   436,   440,   442,
+     444,   451,   541,   583,   625,   738,   745,   752,   762,   771,
+     780,   789,   804,   820,   819,   843,   855,   855,   949,   949,
+     974,   997,  1003,  1004,  1010,  1011,  1018,  1023,  1035,  1049,
+    1051,  1057,  1062,  1064,  1072,  1074,  1083,  1084,  1092,  1097,
+    1097,  1108,  1112,  1120,  1121,  1124,  1126,  1131,  1132,  1141,
+    1142,  1147,  1152,  1158,  1160,  1162,  1169,  1170,  1176,  1177,
+    1182,  1184,  1189,  1191,  1193,  1195,  1201,  1208,  1210,  1212,
+    1228,  1238,  1245,  1247,  1252,  1254,  1256,  1264,  1266,  1271,
+    1273,  1278,  1280,  1282,  1332,  1334,  1336,  1338,  1340,  1342,
+    1344,  1346,  1369,  1374,  1379,  1404,  1410,  1412,  1414,  1416,
+    1418,  1420,  1425,  1429,  1460,  1462,  1468,  1474,  1487,  1488,
+    1489,  1494,  1499,  1503,  1507,  1520,  1533,  1538,  1574,  1592,
+    1593,  1599,  1600,  1605,  1607,  1614,  1631,  1648,  1650,  1657,
+    1662,  1670,  1680,  1692,  1701,  1705,  1709,  1713,  1717,  1721,
+    1724,  1726,  1730,  1734,  1738
 };
 #endif
 
@@ -2039,7 +2040,7 @@ yyreduce:
         case 3:
 
 /* Line 1806 of yacc.c  */
-#line 194 "awkgram.y"
+#line 195 "awkgram.y"
     {
                rule = 0;
                yyerrok;
@@ -2049,7 +2050,7 @@ yyreduce:
   case 5:
 
 /* Line 1806 of yacc.c  */
-#line 200 "awkgram.y"
+#line 201 "awkgram.y"
     {
                next_sourcefile();
          }
@@ -2058,7 +2059,7 @@ yyreduce:
   case 6:
 
 /* Line 1806 of yacc.c  */
-#line 204 "awkgram.y"
+#line 205 "awkgram.y"
     {
                rule = 0;
                /*
@@ -2072,7 +2073,7 @@ yyreduce:
   case 7:
 
 /* Line 1806 of yacc.c  */
-#line 216 "awkgram.y"
+#line 217 "awkgram.y"
     {
                (void) append_rule((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
@@ -2081,7 +2082,7 @@ yyreduce:
   case 8:
 
 /* Line 1806 of yacc.c  */
-#line 220 "awkgram.y"
+#line 221 "awkgram.y"
     {
                if (rule != Rule) {
                        msg(_("%s blocks must have an action part"), 
ruletab[rule]);
@@ -2097,7 +2098,7 @@ yyreduce:
   case 9:
 
 /* Line 1806 of yacc.c  */
-#line 231 "awkgram.y"
+#line 232 "awkgram.y"
     {
                in_function = NULL;
                (void) mk_function((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
@@ -2108,7 +2109,7 @@ yyreduce:
   case 10:
 
 /* Line 1806 of yacc.c  */
-#line 237 "awkgram.y"
+#line 238 "awkgram.y"
     {
                want_source = FALSE;
                yyerrok;
@@ -2118,7 +2119,7 @@ yyreduce:
   case 11:
 
 /* Line 1806 of yacc.c  */
-#line 245 "awkgram.y"
+#line 246 "awkgram.y"
     {
                if (include_source((yyvsp[(1) - (1)])) < 0)
                        YYABORT;
@@ -2131,35 +2132,35 @@ yyreduce:
   case 12:
 
 /* Line 1806 of yacc.c  */
-#line 253 "awkgram.y"
+#line 254 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 13:
 
 /* Line 1806 of yacc.c  */
-#line 255 "awkgram.y"
+#line 256 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 14:
 
 /* Line 1806 of yacc.c  */
-#line 260 "awkgram.y"
+#line 261 "awkgram.y"
     {  (yyval) = NULL; rule = Rule; }
     break;
 
   case 15:
 
 /* Line 1806 of yacc.c  */
-#line 262 "awkgram.y"
+#line 263 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); rule = Rule; }
     break;
 
   case 16:
 
 /* Line 1806 of yacc.c  */
-#line 264 "awkgram.y"
+#line 265 "awkgram.y"
     {
                INSTRUCTION *tp;
 
@@ -2167,7 +2168,7 @@ yyreduce:
                add_lint((yyvsp[(4) - (4)]), LINT_assign_in_cond);
 
                tp = instruction(Op_no_op);
-               list_prepend((yyvsp[(1) - (4)]), bcalloc(Op_line_range, 
!!do_profiling + 1, 0));
+               list_prepend((yyvsp[(1) - (4)]), bcalloc(Op_line_range, 
!!do_pretty_print + 1, 0));
                (yyvsp[(1) - (4)])->nexti->triggered = FALSE;
                (yyvsp[(1) - (4)])->nexti->target_jmp = (yyvsp[(4) - 
(4)])->nexti;
 
@@ -2178,7 +2179,7 @@ yyreduce:
                list_append((yyvsp[(4) - (4)]), instruction(Op_cond_pair));
                (yyvsp[(4) - (4)])->lasti->line_range = (yyvsp[(1) - 
(4)])->nexti;
                (yyvsp[(4) - (4)])->lasti->target_jmp = tp;
-               if (do_profiling) {
+               if (do_pretty_print) {
                        ((yyvsp[(1) - (4)])->nexti + 1)->condpair_left = 
(yyvsp[(1) - (4)])->lasti;
                        ((yyvsp[(1) - (4)])->nexti + 1)->condpair_right = 
(yyvsp[(4) - (4)])->lasti;
                }
@@ -2190,7 +2191,7 @@ yyreduce:
   case 17:
 
 /* Line 1806 of yacc.c  */
-#line 290 "awkgram.y"
+#line 291 "awkgram.y"
     {
                static int begin_seen = 0;
                if (do_lint_old && ++begin_seen == 2)
@@ -2206,7 +2207,7 @@ yyreduce:
   case 18:
 
 /* Line 1806 of yacc.c  */
-#line 301 "awkgram.y"
+#line 302 "awkgram.y"
     {
                static int end_seen = 0;
                if (do_lint_old && ++end_seen == 2)
@@ -2222,7 +2223,7 @@ yyreduce:
   case 19:
 
 /* Line 1806 of yacc.c  */
-#line 312 "awkgram.y"
+#line 313 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->in_rule = rule = BEGINFILE;
                (yyvsp[(1) - (1)])->source_file = source;
@@ -2233,7 +2234,7 @@ yyreduce:
   case 20:
 
 /* Line 1806 of yacc.c  */
-#line 318 "awkgram.y"
+#line 319 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->in_rule = rule = ENDFILE;
                (yyvsp[(1) - (1)])->source_file = source;
@@ -2244,7 +2245,7 @@ yyreduce:
   case 21:
 
 /* Line 1806 of yacc.c  */
-#line 327 "awkgram.y"
+#line 328 "awkgram.y"
     {
                if ((yyvsp[(2) - (5)]) == NULL)
                        (yyval) = list_create(instruction(Op_no_op));
@@ -2256,21 +2257,21 @@ yyreduce:
   case 22:
 
 /* Line 1806 of yacc.c  */
-#line 337 "awkgram.y"
+#line 338 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 23:
 
 /* Line 1806 of yacc.c  */
-#line 339 "awkgram.y"
+#line 340 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 24:
 
 /* Line 1806 of yacc.c  */
-#line 341 "awkgram.y"
+#line 342 "awkgram.y"
     {
                yyerror(_("`%s' is a built-in function, it cannot be 
redefined"),
                                        tokstart);
@@ -2281,14 +2282,14 @@ yyreduce:
   case 25:
 
 /* Line 1806 of yacc.c  */
-#line 347 "awkgram.y"
+#line 348 "awkgram.y"
     { (yyval) = (yyvsp[(2) - (2)]); }
     break;
 
   case 28:
 
 /* Line 1806 of yacc.c  */
-#line 357 "awkgram.y"
+#line 358 "awkgram.y"
     {
                (yyvsp[(1) - (6)])->source_file = source;
                if (install_function((yyvsp[(2) - (6)])->lextok, (yyvsp[(1) - 
(6)]), (yyvsp[(4) - (6)])) < 0)
@@ -2304,14 +2305,14 @@ yyreduce:
   case 29:
 
 /* Line 1806 of yacc.c  */
-#line 375 "awkgram.y"
+#line 376 "awkgram.y"
     { ++want_regexp; }
     break;
 
   case 30:
 
 /* Line 1806 of yacc.c  */
-#line 377 "awkgram.y"
+#line 378 "awkgram.y"
     {
                  NODE *n, *exp;
                  char *re;
@@ -2345,21 +2346,21 @@ yyreduce:
   case 31:
 
 /* Line 1806 of yacc.c  */
-#line 409 "awkgram.y"
+#line 410 "awkgram.y"
     { bcfree((yyvsp[(1) - (1)])); }
     break;
 
   case 33:
 
 /* Line 1806 of yacc.c  */
-#line 415 "awkgram.y"
+#line 416 "awkgram.y"
     {  (yyval) = NULL; }
     break;
 
   case 34:
 
 /* Line 1806 of yacc.c  */
-#line 417 "awkgram.y"
+#line 418 "awkgram.y"
     {
                if ((yyvsp[(2) - (2)]) == NULL)
                        (yyval) = (yyvsp[(1) - (2)]);
@@ -2377,30 +2378,30 @@ yyreduce:
   case 35:
 
 /* Line 1806 of yacc.c  */
-#line 430 "awkgram.y"
+#line 431 "awkgram.y"
     {  (yyval) = NULL; }
     break;
 
   case 38:
 
 /* Line 1806 of yacc.c  */
-#line 440 "awkgram.y"
+#line 441 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 39:
 
 /* Line 1806 of yacc.c  */
-#line 442 "awkgram.y"
+#line 443 "awkgram.y"
     { (yyval) = (yyvsp[(2) - (3)]); }
     break;
 
   case 40:
 
 /* Line 1806 of yacc.c  */
-#line 444 "awkgram.y"
+#line 445 "awkgram.y"
     {
-               if (do_profiling)
+               if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[(1) - (1)]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[(1) - (1)]);
@@ -2410,7 +2411,7 @@ yyreduce:
   case 41:
 
 /* Line 1806 of yacc.c  */
-#line 451 "awkgram.y"
+#line 452 "awkgram.y"
     {
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
                INSTRUCTION *ip, *nextc, *tbreak;
@@ -2469,7 +2470,7 @@ yyreduce:
                                else
                                        dflt->target_jmp = casestmt->nexti;
 
-                               if (do_profiling) {
+                               if (do_pretty_print) {
                                        curr->stmt_start = casestmt->nexti;
                                        curr->stmt_end = casestmt->lasti;
                                        (void) list_prepend(cexp, curr);
@@ -2484,7 +2485,7 @@ yyreduce:
                        efree(case_values);
 
                ip = (yyvsp[(3) - (9)]);
-               if (do_profiling) {
+               if (do_pretty_print) {
                        (void) list_prepend(ip, (yyvsp[(1) - (9)]));
                        (void) list_prepend(ip, instruction(Op_exec_count));
                        (yyvsp[(1) - (9)])->target_break = tbreak;
@@ -2505,7 +2506,7 @@ yyreduce:
   case 42:
 
 /* Line 1806 of yacc.c  */
-#line 541 "awkgram.y"
+#line 542 "awkgram.y"
     { 
                /*
                 *    -----------------
@@ -2528,7 +2529,7 @@ yyreduce:
                ip = list_append((yyvsp[(3) - (6)]), instruction(Op_jmp_false));
                ip->lasti->target_jmp = tbreak;
 
-               if (do_profiling) {
+               if (do_pretty_print) {
                        (void) list_append(ip, instruction(Op_exec_count));
                        (yyvsp[(1) - (6)])->target_break = tbreak;
                        (yyvsp[(1) - (6)])->target_continue = tcont;
@@ -2552,7 +2553,7 @@ yyreduce:
   case 43:
 
 /* Line 1806 of yacc.c  */
-#line 583 "awkgram.y"
+#line 584 "awkgram.y"
     {
                /*
                 *    -----------------
@@ -2575,7 +2576,7 @@ yyreduce:
                        ip = list_merge((yyvsp[(3) - (8)]), (yyvsp[(6) - (8)]));
                else
                        ip = list_prepend((yyvsp[(6) - (8)]), 
instruction(Op_no_op));
-               if (do_profiling)
+               if (do_pretty_print)
                        (void) list_prepend(ip, instruction(Op_exec_count));
                (void) list_append(ip, instruction(Op_jmp_true));
                ip->lasti->target_jmp = ip->nexti;
@@ -2585,7 +2586,7 @@ yyreduce:
                continue_allowed--;
                fix_break_continue(ip, tbreak, tcont);
 
-               if (do_profiling) {
+               if (do_pretty_print) {
                        (yyvsp[(1) - (8)])->target_break = tbreak;
                        (yyvsp[(1) - (8)])->target_continue = tcont;
                        ((yyvsp[(1) - (8)]) + 1)->doloop_cond = tcont;
@@ -2599,7 +2600,7 @@ yyreduce:
   case 44:
 
 /* Line 1806 of yacc.c  */
-#line 625 "awkgram.y"
+#line 626 "awkgram.y"
     {
                INSTRUCTION *ip;
                char *var_name = (yyvsp[(3) - (8)])->lextok;
@@ -2673,7 +2674,7 @@ regular_loop:
                        (yyvsp[(3) - (8)])->target_jmp = tbreak;
                        (void) list_append(ip, (yyvsp[(3) - (8)]));
 
-                       if (do_profiling) {
+                       if (do_pretty_print) {
                                (yyvsp[(1) - (8)])->opcode = Op_K_arrayfor;
                                (yyvsp[(1) - (8)])->target_continue = tcont;
                                (yyvsp[(1) - (8)])->target_break = tbreak;
@@ -2694,7 +2695,7 @@ regular_loop:
                                ip->lasti->assign_var = (yyvsp[(4) - 
(8)])->array_var->var_assign;
                        }
 
-                       if (do_profiling) {
+                       if (do_pretty_print) {
                                (void) list_append(ip, 
instruction(Op_exec_count));
                                ((yyvsp[(1) - (8)]) + 1)->forloop_cond = 
(yyvsp[(4) - (8)]);
                                ((yyvsp[(1) - (8)]) + 1)->forloop_body = 
ip->lasti; 
@@ -2717,7 +2718,7 @@ regular_loop:
   case 45:
 
 /* Line 1806 of yacc.c  */
-#line 738 "awkgram.y"
+#line 739 "awkgram.y"
     {
                (yyval) = mk_for_loop((yyvsp[(1) - (12)]), (yyvsp[(3) - (12)]), 
(yyvsp[(6) - (12)]), (yyvsp[(9) - (12)]), (yyvsp[(12) - (12)]));
 
@@ -2729,7 +2730,7 @@ regular_loop:
   case 46:
 
 /* Line 1806 of yacc.c  */
-#line 745 "awkgram.y"
+#line 746 "awkgram.y"
     {
                (yyval) = mk_for_loop((yyvsp[(1) - (11)]), (yyvsp[(3) - (11)]), 
(INSTRUCTION *) NULL, (yyvsp[(8) - (11)]), (yyvsp[(11) - (11)]));
 
@@ -2741,9 +2742,9 @@ regular_loop:
   case 47:
 
 /* Line 1806 of yacc.c  */
-#line 752 "awkgram.y"
+#line 753 "awkgram.y"
     {
-               if (do_profiling)
+               if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[(1) - (1)]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[(1) - (1)]);
@@ -2753,7 +2754,7 @@ regular_loop:
   case 48:
 
 /* Line 1806 of yacc.c  */
-#line 762 "awkgram.y"
+#line 763 "awkgram.y"
     { 
                if (! break_allowed)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@ -2767,7 +2768,7 @@ regular_loop:
   case 49:
 
 /* Line 1806 of yacc.c  */
-#line 771 "awkgram.y"
+#line 772 "awkgram.y"
     {
                if (! continue_allowed)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@ -2781,7 +2782,7 @@ regular_loop:
   case 50:
 
 /* Line 1806 of yacc.c  */
-#line 780 "awkgram.y"
+#line 781 "awkgram.y"
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@ -2795,7 +2796,7 @@ regular_loop:
   case 51:
 
 /* Line 1806 of yacc.c  */
-#line 789 "awkgram.y"
+#line 790 "awkgram.y"
     {
                if (do_traditional)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@ -2815,7 +2816,7 @@ regular_loop:
   case 52:
 
 /* Line 1806 of yacc.c  */
-#line 804 "awkgram.y"
+#line 805 "awkgram.y"
     {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time. 
@@ -2835,7 +2836,7 @@ regular_loop:
   case 53:
 
 /* Line 1806 of yacc.c  */
-#line 819 "awkgram.y"
+#line 820 "awkgram.y"
     {
                if (! in_function)
                        yyerror(_("`return' used outside function context"));
@@ -2845,7 +2846,7 @@ regular_loop:
   case 54:
 
 /* Line 1806 of yacc.c  */
-#line 822 "awkgram.y"
+#line 823 "awkgram.y"
     {
                if ((yyvsp[(3) - (4)]) == NULL) {
                        (yyval) = list_create((yyvsp[(1) - (4)]));
@@ -2871,14 +2872,14 @@ regular_loop:
   case 56:
 
 /* Line 1806 of yacc.c  */
-#line 854 "awkgram.y"
+#line 855 "awkgram.y"
     { in_print = TRUE; in_parens = 0; }
     break;
 
   case 57:
 
 /* Line 1806 of yacc.c  */
-#line 855 "awkgram.y"
+#line 856 "awkgram.y"
     {
                /*
                 * Optimization: plain `print' has no expression list, so $3 is 
null.
@@ -2976,14 +2977,14 @@ regular_loop:
   case 58:
 
 /* Line 1806 of yacc.c  */
-#line 948 "awkgram.y"
+#line 949 "awkgram.y"
     { sub_counter = 0; }
     break;
 
   case 59:
 
 /* Line 1806 of yacc.c  */
-#line 949 "awkgram.y"
+#line 950 "awkgram.y"
     {
                char *arr = (yyvsp[(2) - (4)])->lextok;
 
@@ -3013,7 +3014,7 @@ regular_loop:
   case 60:
 
 /* Line 1806 of yacc.c  */
-#line 978 "awkgram.y"
+#line 979 "awkgram.y"
     {
                static short warned = FALSE;
                char *arr = (yyvsp[(3) - (4)])->lextok;
@@ -3037,35 +3038,35 @@ regular_loop:
   case 61:
 
 /* Line 1806 of yacc.c  */
-#line 997 "awkgram.y"
+#line 998 "awkgram.y"
     {  (yyval) = optimize_assignment((yyvsp[(1) - (1)])); }
     break;
 
   case 62:
 
 /* Line 1806 of yacc.c  */
-#line 1002 "awkgram.y"
+#line 1003 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 63:
 
 /* Line 1806 of yacc.c  */
-#line 1004 "awkgram.y"
+#line 1005 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 64:
 
 /* Line 1806 of yacc.c  */
-#line 1009 "awkgram.y"
+#line 1010 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 65:
 
 /* Line 1806 of yacc.c  */
-#line 1011 "awkgram.y"
+#line 1012 "awkgram.y"
     {
                if ((yyvsp[(1) - (2)]) == NULL)
                        (yyval) = list_create((yyvsp[(2) - (2)]));
@@ -3077,19 +3078,19 @@ regular_loop:
   case 66:
 
 /* Line 1806 of yacc.c  */
-#line 1018 "awkgram.y"
+#line 1019 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 67:
 
 /* Line 1806 of yacc.c  */
-#line 1023 "awkgram.y"
+#line 1024 "awkgram.y"
     {
                INSTRUCTION *casestmt = (yyvsp[(5) - (5)]);
                if ((yyvsp[(5) - (5)]) == NULL)
                        casestmt = list_create(instruction(Op_no_op));  
-               if (do_profiling)
+               if (do_pretty_print)
                        (void) list_prepend(casestmt, 
instruction(Op_exec_count));
                (yyvsp[(1) - (5)])->case_exp = (yyvsp[(2) - (5)]);
                (yyvsp[(1) - (5)])->case_stmt = casestmt;
@@ -3101,12 +3102,12 @@ regular_loop:
   case 68:
 
 /* Line 1806 of yacc.c  */
-#line 1035 "awkgram.y"
+#line 1036 "awkgram.y"
     {
                INSTRUCTION *casestmt = (yyvsp[(4) - (4)]);
                if ((yyvsp[(4) - (4)]) == NULL)
                        casestmt = list_create(instruction(Op_no_op));
-               if (do_profiling)
+               if (do_pretty_print)
                        (void) list_prepend(casestmt, 
instruction(Op_exec_count));
                bcfree((yyvsp[(2) - (4)]));
                (yyvsp[(1) - (4)])->case_stmt = casestmt;
@@ -3117,14 +3118,14 @@ regular_loop:
   case 69:
 
 /* Line 1806 of yacc.c  */
-#line 1049 "awkgram.y"
+#line 1050 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 70:
 
 /* Line 1806 of yacc.c  */
-#line 1051 "awkgram.y"
+#line 1052 "awkgram.y"
     { 
                (yyvsp[(2) - (2)])->memory->numbr = -(force_number((yyvsp[(2) - 
(2)])->memory));
                bcfree((yyvsp[(1) - (2)]));
@@ -3135,7 +3136,7 @@ regular_loop:
   case 71:
 
 /* Line 1806 of yacc.c  */
-#line 1057 "awkgram.y"
+#line 1058 "awkgram.y"
     {
                bcfree((yyvsp[(1) - (2)]));
                (yyval) = (yyvsp[(2) - (2)]);
@@ -3145,14 +3146,14 @@ regular_loop:
   case 72:
 
 /* Line 1806 of yacc.c  */
-#line 1062 "awkgram.y"
+#line 1063 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 73:
 
 /* Line 1806 of yacc.c  */
-#line 1064 "awkgram.y"
+#line 1065 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->opcode = Op_push_re;
                (yyval) = (yyvsp[(1) - (1)]);
@@ -3162,21 +3163,21 @@ regular_loop:
   case 74:
 
 /* Line 1806 of yacc.c  */
-#line 1072 "awkgram.y"
+#line 1073 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 75:
 
 /* Line 1806 of yacc.c  */
-#line 1074 "awkgram.y"
+#line 1075 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 77:
 
 /* Line 1806 of yacc.c  */
-#line 1084 "awkgram.y"
+#line 1085 "awkgram.y"
     {
                (yyval) = (yyvsp[(2) - (3)]);
          }
@@ -3185,7 +3186,7 @@ regular_loop:
   case 78:
 
 /* Line 1806 of yacc.c  */
-#line 1091 "awkgram.y"
+#line 1092 "awkgram.y"
     {
                in_print = FALSE;
                in_parens = 0;
@@ -3196,14 +3197,14 @@ regular_loop:
   case 79:
 
 /* Line 1806 of yacc.c  */
-#line 1096 "awkgram.y"
+#line 1097 "awkgram.y"
     { in_print = FALSE; in_parens = 0; }
     break;
 
   case 80:
 
 /* Line 1806 of yacc.c  */
-#line 1097 "awkgram.y"
+#line 1098 "awkgram.y"
     {
                if ((yyvsp[(1) - (3)])->redir_type == redirect_twoway
                        && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_K_getline_redir
@@ -3216,7 +3217,7 @@ regular_loop:
   case 81:
 
 /* Line 1806 of yacc.c  */
-#line 1108 "awkgram.y"
+#line 1109 "awkgram.y"
     {
                (yyval) = mk_condition((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)]), 
(yyvsp[(6) - (6)]), NULL, NULL);
          }
@@ -3225,7 +3226,7 @@ regular_loop:
   case 82:
 
 /* Line 1806 of yacc.c  */
-#line 1113 "awkgram.y"
+#line 1114 "awkgram.y"
     {
                (yyval) = mk_condition((yyvsp[(3) - (9)]), (yyvsp[(1) - (9)]), 
(yyvsp[(6) - (9)]), (yyvsp[(7) - (9)]), (yyvsp[(9) - (9)]));
          }
@@ -3234,14 +3235,14 @@ regular_loop:
   case 87:
 
 /* Line 1806 of yacc.c  */
-#line 1130 "awkgram.y"
+#line 1131 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 88:
 
 /* Line 1806 of yacc.c  */
-#line 1132 "awkgram.y"
+#line 1133 "awkgram.y"
     {
                bcfree((yyvsp[(1) - (2)]));
                (yyval) = (yyvsp[(2) - (2)]);
@@ -3251,21 +3252,21 @@ regular_loop:
   case 89:
 
 /* Line 1806 of yacc.c  */
-#line 1140 "awkgram.y"
+#line 1141 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 90:
 
 /* Line 1806 of yacc.c  */
-#line 1142 "awkgram.y"
+#line 1143 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]) ; }
     break;
 
   case 91:
 
 /* Line 1806 of yacc.c  */
-#line 1147 "awkgram.y"
+#line 1148 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->param_count = 0;
                (yyval) = list_create((yyvsp[(1) - (1)]));
@@ -3275,7 +3276,7 @@ regular_loop:
   case 92:
 
 /* Line 1806 of yacc.c  */
-#line 1152 "awkgram.y"
+#line 1153 "awkgram.y"
     {
                (yyvsp[(3) - (3)])->param_count =  (yyvsp[(1) - 
(3)])->lasti->param_count + 1;
                (yyval) = list_append((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]));
@@ -3286,63 +3287,63 @@ regular_loop:
   case 93:
 
 /* Line 1806 of yacc.c  */
-#line 1158 "awkgram.y"
+#line 1159 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 94:
 
 /* Line 1806 of yacc.c  */
-#line 1160 "awkgram.y"
+#line 1161 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (2)]); }
     break;
 
   case 95:
 
 /* Line 1806 of yacc.c  */
-#line 1162 "awkgram.y"
+#line 1163 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (3)]); }
     break;
 
   case 96:
 
 /* Line 1806 of yacc.c  */
-#line 1168 "awkgram.y"
+#line 1169 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 97:
 
 /* Line 1806 of yacc.c  */
-#line 1170 "awkgram.y"
+#line 1171 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 98:
 
 /* Line 1806 of yacc.c  */
-#line 1175 "awkgram.y"
+#line 1176 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 99:
 
 /* Line 1806 of yacc.c  */
-#line 1177 "awkgram.y"
+#line 1178 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 100:
 
 /* Line 1806 of yacc.c  */
-#line 1182 "awkgram.y"
+#line 1183 "awkgram.y"
     {  (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); }
     break;
 
   case 101:
 
 /* Line 1806 of yacc.c  */
-#line 1184 "awkgram.y"
+#line 1185 "awkgram.y"
     {
                (yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - 
(3)]));
                yyerrok;
@@ -3352,35 +3353,35 @@ regular_loop:
   case 102:
 
 /* Line 1806 of yacc.c  */
-#line 1189 "awkgram.y"
+#line 1190 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 103:
 
 /* Line 1806 of yacc.c  */
-#line 1191 "awkgram.y"
+#line 1192 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 104:
 
 /* Line 1806 of yacc.c  */
-#line 1193 "awkgram.y"
+#line 1194 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 105:
 
 /* Line 1806 of yacc.c  */
-#line 1195 "awkgram.y"
+#line 1196 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 106:
 
 /* Line 1806 of yacc.c  */
-#line 1201 "awkgram.y"
+#line 1202 "awkgram.y"
     {
                if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
                        lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@ -3392,21 +3393,21 @@ regular_loop:
   case 107:
 
 /* Line 1806 of yacc.c  */
-#line 1208 "awkgram.y"
+#line 1209 "awkgram.y"
     {  (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
     break;
 
   case 108:
 
 /* Line 1806 of yacc.c  */
-#line 1210 "awkgram.y"
+#line 1211 "awkgram.y"
     {  (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
     break;
 
   case 109:
 
 /* Line 1806 of yacc.c  */
-#line 1212 "awkgram.y"
+#line 1213 "awkgram.y"
     {
                if ((yyvsp[(1) - (3)])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[(2) - (3)])->source_line,
@@ -3427,7 +3428,7 @@ regular_loop:
   case 110:
 
 /* Line 1806 of yacc.c  */
-#line 1228 "awkgram.y"
+#line 1229 "awkgram.y"
     {
                if (do_lint_old)
                        warning_ln((yyvsp[(2) - (3)])->source_line,
@@ -3442,7 +3443,7 @@ regular_loop:
   case 111:
 
 /* Line 1806 of yacc.c  */
-#line 1238 "awkgram.y"
+#line 1239 "awkgram.y"
     {
                if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
                        lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@ -3454,35 +3455,35 @@ regular_loop:
   case 112:
 
 /* Line 1806 of yacc.c  */
-#line 1245 "awkgram.y"
+#line 1246 "awkgram.y"
     { (yyval) = mk_condition((yyvsp[(1) - (5)]), (yyvsp[(2) - (5)]), 
(yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)])); }
     break;
 
   case 113:
 
 /* Line 1806 of yacc.c  */
-#line 1247 "awkgram.y"
+#line 1248 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 114:
 
 /* Line 1806 of yacc.c  */
-#line 1252 "awkgram.y"
+#line 1253 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 115:
 
 /* Line 1806 of yacc.c  */
-#line 1254 "awkgram.y"
+#line 1255 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 116:
 
 /* Line 1806 of yacc.c  */
-#line 1256 "awkgram.y"
+#line 1257 "awkgram.y"
     {  
                (yyvsp[(2) - (2)])->opcode = Op_assign_quotient;
                (yyval) = (yyvsp[(2) - (2)]);
@@ -3492,49 +3493,49 @@ regular_loop:
   case 117:
 
 /* Line 1806 of yacc.c  */
-#line 1264 "awkgram.y"
+#line 1265 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 118:
 
 /* Line 1806 of yacc.c  */
-#line 1266 "awkgram.y"
+#line 1267 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 119:
 
 /* Line 1806 of yacc.c  */
-#line 1271 "awkgram.y"
+#line 1272 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 120:
 
 /* Line 1806 of yacc.c  */
-#line 1273 "awkgram.y"
+#line 1274 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 121:
 
 /* Line 1806 of yacc.c  */
-#line 1278 "awkgram.y"
+#line 1279 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 122:
 
 /* Line 1806 of yacc.c  */
-#line 1280 "awkgram.y"
+#line 1281 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 123:
 
 /* Line 1806 of yacc.c  */
-#line 1282 "awkgram.y"
+#line 1283 "awkgram.y"
     {
                int count = 2;
                int is_simple_var = FALSE;
@@ -3586,49 +3587,49 @@ regular_loop:
   case 125:
 
 /* Line 1806 of yacc.c  */
-#line 1334 "awkgram.y"
+#line 1335 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 126:
 
 /* Line 1806 of yacc.c  */
-#line 1336 "awkgram.y"
+#line 1337 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 127:
 
 /* Line 1806 of yacc.c  */
-#line 1338 "awkgram.y"
+#line 1339 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 128:
 
 /* Line 1806 of yacc.c  */
-#line 1340 "awkgram.y"
+#line 1341 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 129:
 
 /* Line 1806 of yacc.c  */
-#line 1342 "awkgram.y"
+#line 1343 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 130:
 
 /* Line 1806 of yacc.c  */
-#line 1344 "awkgram.y"
+#line 1345 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 131:
 
 /* Line 1806 of yacc.c  */
-#line 1346 "awkgram.y"
+#line 1347 "awkgram.y"
     {
                /*
                 * In BEGINFILE/ENDFILE, allow `getline var < file'
@@ -3656,7 +3657,7 @@ regular_loop:
   case 132:
 
 /* Line 1806 of yacc.c  */
-#line 1369 "awkgram.y"
+#line 1370 "awkgram.y"
     {
                (yyvsp[(2) - (2)])->opcode = Op_postincrement;
                (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - 
(2)]));
@@ -3666,7 +3667,7 @@ regular_loop:
   case 133:
 
 /* Line 1806 of yacc.c  */
-#line 1374 "awkgram.y"
+#line 1375 "awkgram.y"
     {
                (yyvsp[(2) - (2)])->opcode = Op_postdecrement;
                (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - 
(2)]));
@@ -3676,7 +3677,7 @@ regular_loop:
   case 134:
 
 /* Line 1806 of yacc.c  */
-#line 1379 "awkgram.y"
+#line 1380 "awkgram.y"
     {
                if (do_lint_old) {
                    warning_ln((yyvsp[(4) - (5)])->source_line,
@@ -3701,7 +3702,7 @@ regular_loop:
   case 135:
 
 /* Line 1806 of yacc.c  */
-#line 1404 "awkgram.y"
+#line 1405 "awkgram.y"
     {
                  (yyval) = mk_getline((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]), 
(yyvsp[(1) - (4)]), (yyvsp[(2) - (4)])->redir_type);
                  bcfree((yyvsp[(2) - (4)]));
@@ -3711,49 +3712,49 @@ regular_loop:
   case 136:
 
 /* Line 1806 of yacc.c  */
-#line 1410 "awkgram.y"
+#line 1411 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 137:
 
 /* Line 1806 of yacc.c  */
-#line 1412 "awkgram.y"
+#line 1413 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 138:
 
 /* Line 1806 of yacc.c  */
-#line 1414 "awkgram.y"
+#line 1415 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 139:
 
 /* Line 1806 of yacc.c  */
-#line 1416 "awkgram.y"
+#line 1417 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 140:
 
 /* Line 1806 of yacc.c  */
-#line 1418 "awkgram.y"
+#line 1419 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 141:
 
 /* Line 1806 of yacc.c  */
-#line 1420 "awkgram.y"
+#line 1421 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 142:
 
 /* Line 1806 of yacc.c  */
-#line 1425 "awkgram.y"
+#line 1426 "awkgram.y"
     {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
@@ -3762,7 +3763,7 @@ regular_loop:
   case 143:
 
 /* Line 1806 of yacc.c  */
-#line 1429 "awkgram.y"
+#line 1430 "awkgram.y"
     {
                if ((yyvsp[(2) - (2)])->opcode == Op_match_rec) {
                        (yyvsp[(2) - (2)])->opcode = Op_nomatch;
@@ -3798,14 +3799,14 @@ regular_loop:
   case 144:
 
 /* Line 1806 of yacc.c  */
-#line 1460 "awkgram.y"
+#line 1461 "awkgram.y"
     { (yyval) = (yyvsp[(2) - (3)]); }
     break;
 
   case 145:
 
 /* Line 1806 of yacc.c  */
-#line 1462 "awkgram.y"
+#line 1463 "awkgram.y"
     {
                (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
                if ((yyval) == NULL)
@@ -3816,7 +3817,7 @@ regular_loop:
   case 146:
 
 /* Line 1806 of yacc.c  */
-#line 1468 "awkgram.y"
+#line 1469 "awkgram.y"
     {
                (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
                if ((yyval) == NULL)
@@ -3827,7 +3828,7 @@ regular_loop:
   case 147:
 
 /* Line 1806 of yacc.c  */
-#line 1474 "awkgram.y"
+#line 1475 "awkgram.y"
     {
                static short warned1 = FALSE;
 
@@ -3845,7 +3846,7 @@ regular_loop:
   case 150:
 
 /* Line 1806 of yacc.c  */
-#line 1489 "awkgram.y"
+#line 1490 "awkgram.y"
     {
                (yyvsp[(1) - (2)])->opcode = Op_preincrement;
                (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - 
(2)]));
@@ -3855,7 +3856,7 @@ regular_loop:
   case 151:
 
 /* Line 1806 of yacc.c  */
-#line 1494 "awkgram.y"
+#line 1495 "awkgram.y"
     {
                (yyvsp[(1) - (2)])->opcode = Op_predecrement;
                (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - 
(2)]));
@@ -3865,7 +3866,7 @@ regular_loop:
   case 152:
 
 /* Line 1806 of yacc.c  */
-#line 1499 "awkgram.y"
+#line 1500 "awkgram.y"
     {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
@@ -3874,7 +3875,7 @@ regular_loop:
   case 153:
 
 /* Line 1806 of yacc.c  */
-#line 1503 "awkgram.y"
+#line 1504 "awkgram.y"
     {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
@@ -3883,7 +3884,7 @@ regular_loop:
   case 154:
 
 /* Line 1806 of yacc.c  */
-#line 1507 "awkgram.y"
+#line 1508 "awkgram.y"
     {
                if ((yyvsp[(2) - (2)])->lasti->opcode == Op_push_i
                        && ((yyvsp[(2) - (2)])->lasti->memory->flags & 
(STRCUR|STRING)) == 0
@@ -3901,7 +3902,7 @@ regular_loop:
   case 155:
 
 /* Line 1806 of yacc.c  */
-#line 1520 "awkgram.y"
+#line 1521 "awkgram.y"
     {
            /*
             * was: $$ = $2
@@ -3916,7 +3917,7 @@ regular_loop:
   case 156:
 
 /* Line 1806 of yacc.c  */
-#line 1533 "awkgram.y"
+#line 1534 "awkgram.y"
     {
                func_use((yyvsp[(1) - (1)])->lasti->func_name, FUNC_USE);
                (yyval) = (yyvsp[(1) - (1)]);
@@ -3926,7 +3927,7 @@ regular_loop:
   case 157:
 
 /* Line 1806 of yacc.c  */
-#line 1538 "awkgram.y"
+#line 1539 "awkgram.y"
     {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@ -3964,7 +3965,7 @@ regular_loop:
   case 158:
 
 /* Line 1806 of yacc.c  */
-#line 1574 "awkgram.y"
+#line 1575 "awkgram.y"
     {
                param_sanity((yyvsp[(3) - (4)]));
                (yyvsp[(1) - (4)])->opcode = Op_func_call;
@@ -3983,42 +3984,42 @@ regular_loop:
   case 159:
 
 /* Line 1806 of yacc.c  */
-#line 1591 "awkgram.y"
+#line 1592 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 160:
 
 /* Line 1806 of yacc.c  */
-#line 1593 "awkgram.y"
+#line 1594 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 161:
 
 /* Line 1806 of yacc.c  */
-#line 1598 "awkgram.y"
+#line 1599 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 162:
 
 /* Line 1806 of yacc.c  */
-#line 1600 "awkgram.y"
+#line 1601 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (2)]); }
     break;
 
   case 163:
 
 /* Line 1806 of yacc.c  */
-#line 1605 "awkgram.y"
+#line 1606 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 164:
 
 /* Line 1806 of yacc.c  */
-#line 1607 "awkgram.y"
+#line 1608 "awkgram.y"
     {
                (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
@@ -4027,7 +4028,7 @@ regular_loop:
   case 165:
 
 /* Line 1806 of yacc.c  */
-#line 1614 "awkgram.y"
+#line 1615 "awkgram.y"
     {
                INSTRUCTION *ip = (yyvsp[(1) - (1)])->lasti; 
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@ -4046,7 +4047,7 @@ regular_loop:
   case 166:
 
 /* Line 1806 of yacc.c  */
-#line 1631 "awkgram.y"
+#line 1632 "awkgram.y"
     {
                INSTRUCTION *t = (yyvsp[(2) - (3)]);
                if ((yyvsp[(2) - (3)]) == NULL) {
@@ -4065,14 +4066,14 @@ regular_loop:
   case 167:
 
 /* Line 1806 of yacc.c  */
-#line 1648 "awkgram.y"
+#line 1649 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 168:
 
 /* Line 1806 of yacc.c  */
-#line 1650 "awkgram.y"
+#line 1651 "awkgram.y"
     {
                (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
@@ -4081,14 +4082,14 @@ regular_loop:
   case 169:
 
 /* Line 1806 of yacc.c  */
-#line 1657 "awkgram.y"
+#line 1658 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (2)]); }
     break;
 
   case 170:
 
 /* Line 1806 of yacc.c  */
-#line 1662 "awkgram.y"
+#line 1663 "awkgram.y"
     {
                char *var_name = (yyvsp[(1) - (1)])->lextok;
 
@@ -4101,7 +4102,7 @@ regular_loop:
   case 171:
 
 /* Line 1806 of yacc.c  */
-#line 1670 "awkgram.y"
+#line 1671 "awkgram.y"
     {
                char *arr = (yyvsp[(1) - (2)])->lextok;
                (yyvsp[(1) - (2)])->memory = variable((yyvsp[(1) - 
(2)])->source_line, arr, Node_var_new);
@@ -4113,7 +4114,7 @@ regular_loop:
   case 172:
 
 /* Line 1806 of yacc.c  */
-#line 1680 "awkgram.y"
+#line 1681 "awkgram.y"
     {
                INSTRUCTION *ip = (yyvsp[(1) - (1)])->nexti;
                if (ip->opcode == Op_push
@@ -4130,7 +4131,7 @@ regular_loop:
   case 173:
 
 /* Line 1806 of yacc.c  */
-#line 1692 "awkgram.y"
+#line 1693 "awkgram.y"
     {
                (yyval) = list_append((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)]));
                if ((yyvsp[(3) - (3)]) != NULL)
@@ -4141,7 +4142,7 @@ regular_loop:
   case 174:
 
 /* Line 1806 of yacc.c  */
-#line 1701 "awkgram.y"
+#line 1702 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->opcode = Op_postincrement;
          }
@@ -4150,7 +4151,7 @@ regular_loop:
   case 175:
 
 /* Line 1806 of yacc.c  */
-#line 1705 "awkgram.y"
+#line 1706 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->opcode = Op_postdecrement;
          }
@@ -4159,49 +4160,49 @@ regular_loop:
   case 176:
 
 /* Line 1806 of yacc.c  */
-#line 1708 "awkgram.y"
+#line 1709 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 178:
 
 /* Line 1806 of yacc.c  */
-#line 1716 "awkgram.y"
+#line 1717 "awkgram.y"
     { yyerrok; }
     break;
 
   case 179:
 
 /* Line 1806 of yacc.c  */
-#line 1720 "awkgram.y"
+#line 1721 "awkgram.y"
     { yyerrok; }
     break;
 
   case 182:
 
 /* Line 1806 of yacc.c  */
-#line 1729 "awkgram.y"
+#line 1730 "awkgram.y"
     { yyerrok; }
     break;
 
   case 183:
 
 /* Line 1806 of yacc.c  */
-#line 1733 "awkgram.y"
+#line 1734 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); yyerrok; }
     break;
 
   case 184:
 
 /* Line 1806 of yacc.c  */
-#line 1737 "awkgram.y"
+#line 1738 "awkgram.y"
     { yyerrok; }
     break;
 
 
 
 /* Line 1806 of yacc.c  */
-#line 4217 "awkgram.c"
+#line 4218 "awkgram.c"
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -4432,7 +4433,7 @@ yyreturn:
 
 
 /* Line 2067 of yacc.c  */
-#line 1739 "awkgram.y"
+#line 1740 "awkgram.y"
 
 
 struct token {
@@ -4607,7 +4608,7 @@ print_included_from()
                        line--;
                msg("%s %s:%d%c",
                        s->prev == sourcefile ? "In file included from"
-                                                                 : "           
      from",
+                                         : "                 from",
                        (s->stype == SRC_INC ||
                                 s->stype == SRC_FILE) ? s->src : "cmd. line",
                        line,
@@ -4889,7 +4890,10 @@ parse_program(INSTRUCTION **pcode)
                ip_atexit = instruction(Op_atexit);     /* target for `exit' in 
END block */
        }
 
-       sourcefile = srcfiles->next;
+       for (sourcefile = srcfiles->next; sourcefile->stype == SRC_EXTLIB;
+                       sourcefile = sourcefile->next)
+               ;
+
        lexeof = FALSE;
        lexptr = NULL;
        lasttok = 0;
@@ -4906,6 +4910,11 @@ parse_program(INSTRUCTION **pcode)
        if (ret == 0)   /* avoid spurious warning if parser aborted with 
YYABORT */
                check_funcs();
 
+       if (args_array == NULL)
+               emalloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), 
"parse_program");
+       else
+               erealloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), 
"parse_program");
+
        return (ret || errcount);
 }
 
@@ -4948,7 +4957,7 @@ add_srcfile(int stype, char *src, SRCFILE *thisfile, int 
*already_included, int
        if (stype == SRC_CMDLINE || stype == SRC_STDIN)
                return do_add_srcfile(stype, src, NULL, thisfile);
 
-       path = find_source(src, &sbuf, &errno_val);
+       path = find_source(src, & sbuf, &errno_val, stype == SRC_EXTLIB);
        if (path == NULL) {
                if (errcode) {
                        *errcode = errno_val;
@@ -4959,7 +4968,7 @@ add_srcfile(int stype, char *src, SRCFILE *thisfile, int 
*already_included, int
        }
 
        for (s = srcfiles->next; s != srcfiles; s = s->next) {
-               if ((s->stype == SRC_FILE || s->stype == SRC_INC)
+               if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == 
SRC_EXTLIB)
                                && files_are_same(path, s)
                ) {
                        if (do_lint) {
@@ -5076,9 +5085,12 @@ next_sourcefile()
                sourcefile->lexptr_begin = NULL;
        }
 
-       sourcefile = sourcefile->next;
-       if (sourcefile == srcfiles)
-               return;
+       while ((sourcefile = sourcefile->next) != NULL) {
+               if (sourcefile == srcfiles)
+                       return;
+               if (sourcefile->stype != SRC_EXTLIB)
+                       break;
+       }
 
        if (sourcefile->lexptr_begin != NULL) {
                /* resume reading from already opened file (postponed to 
process '@include') */
@@ -6175,7 +6187,7 @@ retry:
                case LEX_WHILE:
                case LEX_DO:
                case LEX_SWITCH:
-                       if (! do_profiling)
+                       if (! do_pretty_print)
                                return lasttok = class;
                        /* fall through */
                case LEX_CASE:
@@ -6629,7 +6641,7 @@ mk_function(INSTRUCTION *fi, INSTRUCTION *def)
        def->lasti->memory = dupnode(Nnull_string);
        (void) list_append(def, instruction(Op_K_return));
 
-       if (do_profiling)
+       if (do_pretty_print)
                (void) list_prepend(def, instruction(Op_exec_count));
 
        /* fi->opcode = Op_func */
@@ -7254,7 +7266,7 @@ mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, 
INSTRUCTION *true_branch,
        if (false_branch == NULL) {
                false_branch = list_create(instruction(Op_no_op));
                if (elsep != NULL) {            /* else { } */
-                       if (do_profiling)
+                       if (do_pretty_print)
                                (void) list_prepend(false_branch, elsep);
                        else
                                bcfree(elsep);
@@ -7265,7 +7277,7 @@ mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, 
INSTRUCTION *true_branch,
                /* avoid a series of no_op's: if .. else if .. else if .. */
                if (false_branch->lasti->opcode != Op_no_op)
                        (void) list_append(false_branch, instruction(Op_no_op));
-               if (do_profiling) {
+               if (do_pretty_print) {
                        (void) list_prepend(false_branch, elsep);
                        false_branch->nexti->branch_end = false_branch->lasti;
                        (void) list_prepend(false_branch, 
instruction(Op_exec_count));
@@ -7280,7 +7292,7 @@ mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, 
INSTRUCTION *true_branch,
        ip = list_append(cond, instruction(Op_jmp_false));
        ip->lasti->target_jmp = false_branch->nexti->nexti;
 
-       if (do_profiling) {
+       if (do_pretty_print) {
                (void) list_prepend(ip, ifp);
                (void) list_append(ip, instruction(Op_exec_count));
                ip->nexti->branch_if = ip->lasti;
@@ -7342,7 +7354,7 @@ append_rule(INSTRUCTION *pattern, INSTRUCTION *action)
 
        if (rule != Rule) {
                rp = pattern;
-               if (do_profiling)
+               if (do_pretty_print)
                        (void) list_append(action, instruction(Op_no_op));
                (rp + 1)->firsti = action->nexti;
                (rp + 1)->lasti = action->lasti;
@@ -7358,7 +7370,7 @@ append_rule(INSTRUCTION *pattern, INSTRUCTION *action)
 
                if (pattern == NULL) {
                        /* assert(action != NULL); */
-                       if (do_profiling)
+                       if (do_pretty_print)
                                (void) list_prepend(action, 
instruction(Op_exec_count));
                        (rp + 1)->firsti = action->nexti;
                        (rp + 1)->lasti = tp;
@@ -7374,12 +7386,12 @@ append_rule(INSTRUCTION *pattern, INSTRUCTION *action)
                        if (action == NULL) {
                                (rp + 2)->last_line = find_line(pattern, 
LAST_LINE);
                                action = 
list_create(instruction(Op_K_print_rec));
-                               if (do_profiling)
+                               if (do_pretty_print)
                                        (void) list_prepend(action, 
instruction(Op_exec_count));
                        } else
                                (rp + 2)->last_line = lastline;
 
-                       if (do_profiling) {
+                       if (do_pretty_print) {
                                (void) list_prepend(pattern, 
instruction(Op_exec_count));
                                (void) list_prepend(action, 
instruction(Op_exec_count));
                        }
@@ -7720,7 +7732,7 @@ mk_for_loop(INSTRUCTION *forp, INSTRUCTION *init, 
INSTRUCTION *cond,
        if (init != NULL)
                ip = list_merge(init, ip);
 
-       if (do_profiling) {
+       if (do_pretty_print) {
                (void) list_append(ip, instruction(Op_exec_count));
                (forp + 1)->forloop_cond = pp_cond;
                (forp + 1)->forloop_body = ip->lasti;
@@ -7742,7 +7754,7 @@ mk_for_loop(INSTRUCTION *forp, INSTRUCTION *init, 
INSTRUCTION *cond,
        ret = list_append(ip, tbreak);
        fix_break_continue(ret, tbreak, tcont);
 
-       if (do_profiling) {
+       if (do_pretty_print) {
                forp->target_break = tbreak;
                forp->target_continue = tcont;
                ret = list_prepend(ret, forp);
diff --git a/awkgram.y b/awkgram.y
index 08eb990..968bf53 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -129,6 +129,7 @@ extern int sourceline;
 extern SRCFILE *srcfiles;
 extern INSTRUCTION *rule_list;
 extern int max_args;
+extern NODE **args_array;
 
 static INSTRUCTION *rule_block[sizeof(ruletab)];
 
@@ -268,7 +269,7 @@ pattern
                add_lint($4, LINT_assign_in_cond);
 
                tp = instruction(Op_no_op);
-               list_prepend($1, bcalloc(Op_line_range, !!do_profiling + 1, 0));
+               list_prepend($1, bcalloc(Op_line_range, !!do_pretty_print + 1, 
0));
                $1->nexti->triggered = FALSE;
                $1->nexti->target_jmp = $4->nexti;
 
@@ -279,7 +280,7 @@ pattern
                list_append($4, instruction(Op_cond_pair));
                $4->lasti->line_range = $1->nexti;
                $4->lasti->target_jmp = tp;
-               if (do_profiling) {
+               if (do_pretty_print) {
                        ($1->nexti + 1)->condpair_left = $1->lasti;
                        ($1->nexti + 1)->condpair_right = $4->lasti;
                }
@@ -442,7 +443,7 @@ statement
          { $$ = $2; }
        | if_statement
          {
-               if (do_profiling)
+               if (do_pretty_print)
                        $$ = list_prepend($1, instruction(Op_exec_count));
                else
                        $$ = $1;
@@ -506,7 +507,7 @@ statement
                                else
                                        dflt->target_jmp = casestmt->nexti;
 
-                               if (do_profiling) {
+                               if (do_pretty_print) {
                                        curr->stmt_start = casestmt->nexti;
                                        curr->stmt_end = casestmt->lasti;
                                        (void) list_prepend(cexp, curr);
@@ -521,7 +522,7 @@ statement
                        efree(case_values);
 
                ip = $3;
-               if (do_profiling) {
+               if (do_pretty_print) {
                        (void) list_prepend(ip, $1);
                        (void) list_prepend(ip, instruction(Op_exec_count));
                        $1->target_break = tbreak;
@@ -560,7 +561,7 @@ statement
                ip = list_append($3, instruction(Op_jmp_false));
                ip->lasti->target_jmp = tbreak;
 
-               if (do_profiling) {
+               if (do_pretty_print) {
                        (void) list_append(ip, instruction(Op_exec_count));
                        $1->target_break = tbreak;
                        $1->target_continue = tcont;
@@ -602,7 +603,7 @@ statement
                        ip = list_merge($3, $6);
                else
                        ip = list_prepend($6, instruction(Op_no_op));
-               if (do_profiling)
+               if (do_pretty_print)
                        (void) list_prepend(ip, instruction(Op_exec_count));
                (void) list_append(ip, instruction(Op_jmp_true));
                ip->lasti->target_jmp = ip->nexti;
@@ -612,7 +613,7 @@ statement
                continue_allowed--;
                fix_break_continue(ip, tbreak, tcont);
 
-               if (do_profiling) {
+               if (do_pretty_print) {
                        $1->target_break = tbreak;
                        $1->target_continue = tcont;
                        ($1 + 1)->doloop_cond = tcont;
@@ -695,7 +696,7 @@ regular_loop:
                        $3->target_jmp = tbreak;
                        (void) list_append(ip, $3);
 
-                       if (do_profiling) {
+                       if (do_pretty_print) {
                                $1->opcode = Op_K_arrayfor;
                                $1->target_continue = tcont;
                                $1->target_break = tbreak;
@@ -716,7 +717,7 @@ regular_loop:
                                ip->lasti->assign_var = 
$4->array_var->var_assign;
                        }
 
-                       if (do_profiling) {
+                       if (do_pretty_print) {
                                (void) list_append(ip, 
instruction(Op_exec_count));
                                ($1 + 1)->forloop_cond = $4;
                                ($1 + 1)->forloop_body = ip->lasti; 
@@ -750,7 +751,7 @@ regular_loop:
          }
        | non_compound_stmt
          {
-               if (do_profiling)
+               if (do_pretty_print)
                        $$ = list_prepend($1, instruction(Op_exec_count));
                else
                        $$ = $1;
@@ -1024,7 +1025,7 @@ case_statement
                INSTRUCTION *casestmt = $5;
                if ($5 == NULL)
                        casestmt = list_create(instruction(Op_no_op));  
-               if (do_profiling)
+               if (do_pretty_print)
                        (void) list_prepend(casestmt, 
instruction(Op_exec_count));
                $1->case_exp = $2;
                $1->case_stmt = casestmt;
@@ -1036,7 +1037,7 @@ case_statement
                INSTRUCTION *casestmt = $4;
                if ($4 == NULL)
                        casestmt = list_create(instruction(Op_no_op));
-               if (do_profiling)
+               if (do_pretty_print)
                        (void) list_prepend(casestmt, 
instruction(Op_exec_count));
                bcfree($2);
                $1->case_stmt = casestmt;
@@ -1910,7 +1911,7 @@ print_included_from()
                        line--;
                msg("%s %s:%d%c",
                        s->prev == sourcefile ? "In file included from"
-                                                                 : "           
      from",
+                                         : "                 from",
                        (s->stype == SRC_INC ||
                                 s->stype == SRC_FILE) ? s->src : "cmd. line",
                        line,
@@ -2192,7 +2193,10 @@ parse_program(INSTRUCTION **pcode)
                ip_atexit = instruction(Op_atexit);     /* target for `exit' in 
END block */
        }
 
-       sourcefile = srcfiles->next;
+       for (sourcefile = srcfiles->next; sourcefile->stype == SRC_EXTLIB;
+                       sourcefile = sourcefile->next)
+               ;
+
        lexeof = FALSE;
        lexptr = NULL;
        lasttok = 0;
@@ -2209,6 +2213,11 @@ parse_program(INSTRUCTION **pcode)
        if (ret == 0)   /* avoid spurious warning if parser aborted with 
YYABORT */
                check_funcs();
 
+       if (args_array == NULL)
+               emalloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), 
"parse_program");
+       else
+               erealloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), 
"parse_program");
+
        return (ret || errcount);
 }
 
@@ -2251,7 +2260,7 @@ add_srcfile(int stype, char *src, SRCFILE *thisfile, int 
*already_included, int
        if (stype == SRC_CMDLINE || stype == SRC_STDIN)
                return do_add_srcfile(stype, src, NULL, thisfile);
 
-       path = find_source(src, &sbuf, &errno_val);
+       path = find_source(src, & sbuf, &errno_val, stype == SRC_EXTLIB);
        if (path == NULL) {
                if (errcode) {
                        *errcode = errno_val;
@@ -2262,7 +2271,7 @@ add_srcfile(int stype, char *src, SRCFILE *thisfile, int 
*already_included, int
        }
 
        for (s = srcfiles->next; s != srcfiles; s = s->next) {
-               if ((s->stype == SRC_FILE || s->stype == SRC_INC)
+               if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == 
SRC_EXTLIB)
                                && files_are_same(path, s)
                ) {
                        if (do_lint) {
@@ -2379,9 +2388,12 @@ next_sourcefile()
                sourcefile->lexptr_begin = NULL;
        }
 
-       sourcefile = sourcefile->next;
-       if (sourcefile == srcfiles)
-               return;
+       while ((sourcefile = sourcefile->next) != NULL) {
+               if (sourcefile == srcfiles)
+                       return;
+               if (sourcefile->stype != SRC_EXTLIB)
+                       break;
+       }
 
        if (sourcefile->lexptr_begin != NULL) {
                /* resume reading from already opened file (postponed to 
process '@include') */
@@ -3478,7 +3490,7 @@ retry:
                case LEX_WHILE:
                case LEX_DO:
                case LEX_SWITCH:
-                       if (! do_profiling)
+                       if (! do_pretty_print)
                                return lasttok = class;
                        /* fall through */
                case LEX_CASE:
@@ -3932,7 +3944,7 @@ mk_function(INSTRUCTION *fi, INSTRUCTION *def)
        def->lasti->memory = dupnode(Nnull_string);
        (void) list_append(def, instruction(Op_K_return));
 
-       if (do_profiling)
+       if (do_pretty_print)
                (void) list_prepend(def, instruction(Op_exec_count));
 
        /* fi->opcode = Op_func */
@@ -4557,7 +4569,7 @@ mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, 
INSTRUCTION *true_branch,
        if (false_branch == NULL) {
                false_branch = list_create(instruction(Op_no_op));
                if (elsep != NULL) {            /* else { } */
-                       if (do_profiling)
+                       if (do_pretty_print)
                                (void) list_prepend(false_branch, elsep);
                        else
                                bcfree(elsep);
@@ -4568,7 +4580,7 @@ mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, 
INSTRUCTION *true_branch,
                /* avoid a series of no_op's: if .. else if .. else if .. */
                if (false_branch->lasti->opcode != Op_no_op)
                        (void) list_append(false_branch, instruction(Op_no_op));
-               if (do_profiling) {
+               if (do_pretty_print) {
                        (void) list_prepend(false_branch, elsep);
                        false_branch->nexti->branch_end = false_branch->lasti;
                        (void) list_prepend(false_branch, 
instruction(Op_exec_count));
@@ -4583,7 +4595,7 @@ mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, 
INSTRUCTION *true_branch,
        ip = list_append(cond, instruction(Op_jmp_false));
        ip->lasti->target_jmp = false_branch->nexti->nexti;
 
-       if (do_profiling) {
+       if (do_pretty_print) {
                (void) list_prepend(ip, ifp);
                (void) list_append(ip, instruction(Op_exec_count));
                ip->nexti->branch_if = ip->lasti;
@@ -4645,7 +4657,7 @@ append_rule(INSTRUCTION *pattern, INSTRUCTION *action)
 
        if (rule != Rule) {
                rp = pattern;
-               if (do_profiling)
+               if (do_pretty_print)
                        (void) list_append(action, instruction(Op_no_op));
                (rp + 1)->firsti = action->nexti;
                (rp + 1)->lasti = action->lasti;
@@ -4661,7 +4673,7 @@ append_rule(INSTRUCTION *pattern, INSTRUCTION *action)
 
                if (pattern == NULL) {
                        /* assert(action != NULL); */
-                       if (do_profiling)
+                       if (do_pretty_print)
                                (void) list_prepend(action, 
instruction(Op_exec_count));
                        (rp + 1)->firsti = action->nexti;
                        (rp + 1)->lasti = tp;
@@ -4677,12 +4689,12 @@ append_rule(INSTRUCTION *pattern, INSTRUCTION *action)
                        if (action == NULL) {
                                (rp + 2)->last_line = find_line(pattern, 
LAST_LINE);
                                action = 
list_create(instruction(Op_K_print_rec));
-                               if (do_profiling)
+                               if (do_pretty_print)
                                        (void) list_prepend(action, 
instruction(Op_exec_count));
                        } else
                                (rp + 2)->last_line = lastline;
 
-                       if (do_profiling) {
+                       if (do_pretty_print) {
                                (void) list_prepend(pattern, 
instruction(Op_exec_count));
                                (void) list_prepend(action, 
instruction(Op_exec_count));
                        }
@@ -5023,7 +5035,7 @@ mk_for_loop(INSTRUCTION *forp, INSTRUCTION *init, 
INSTRUCTION *cond,
        if (init != NULL)
                ip = list_merge(init, ip);
 
-       if (do_profiling) {
+       if (do_pretty_print) {
                (void) list_append(ip, instruction(Op_exec_count));
                (forp + 1)->forloop_cond = pp_cond;
                (forp + 1)->forloop_body = ip->lasti;
@@ -5045,7 +5057,7 @@ mk_for_loop(INSTRUCTION *forp, INSTRUCTION *init, 
INSTRUCTION *cond,
        ret = list_append(ip, tbreak);
        fix_break_continue(ret, tbreak, tcont);
 
-       if (do_profiling) {
+       if (do_pretty_print) {
                forp->target_break = tbreak;
                forp->target_continue = tcont;
                ret = list_prepend(ret, forp);
diff --git a/cint_array.c b/cint_array.c
index 3d812cb..400e91d 100644
--- a/cint_array.c
+++ b/cint_array.c
@@ -316,10 +316,14 @@ cint_remove(NODE *symbol, NODE *subs)
        int h1;
        NODE *tn, *xn = symbol->xarray;
 
-       assert(symbol->nodes != NULL);
+       if (symbol->table_size == 0)
+               return NULL;
+
        if (! ISUINT(symbol, subs))
                goto xremove;
 
+       assert(symbol->nodes != NULL);
+
        k = subs->numbr;
        h1 = cint_hash(k);
        tn = symbol->nodes[h1];
@@ -338,6 +342,7 @@ cint_remove(NODE *symbol, NODE *subs)
                init_array(symbol);     /* re-initialize array 'symbol' */
        } else if(xn != NULL && symbol->table_size == xn->table_size) {
                /* promote xn to symbol */
+
                xn->flags &= ~XARRAY;
                xn->parent_array = symbol->parent_array;
                efree(symbol->nodes);
diff --git a/debug.c b/debug.c
index 3741811..76c2dcb 100644
--- a/debug.c
+++ b/debug.c
@@ -40,7 +40,6 @@ extern FILE *output_fp;
 extern IOBUF *curfile;
 extern const char *command_file;
 extern const char *get_spec_varname(Func_ptr fptr);
-extern int r_interpret(INSTRUCTION *);
 extern int zzparse(void);
 #define read_command()         (void) zzparse()
 
@@ -214,9 +213,9 @@ struct dbg_option {
        const char *help_txt; 
 };
 
-#define DEFAULT_HISTFILE       "./.dgawk_history"
-#define DEFAULT_OPTFILE                "./.dgawkrc"
-#define DEFAULT_PROMPT         "dgawk> "
+#define DEFAULT_HISTFILE       "./.gawk_history"
+#define DEFAULT_OPTFILE                "./.gawkrc"
+#define DEFAULT_PROMPT         "gawk> "
 #define DEFAULT_LISTSIZE       15
 #define DEFAULT_HISTSIZE       100
 
@@ -235,7 +234,7 @@ static const char *history_file = DEFAULT_HISTFILE;
 /* keep all option variables in one place */
 
 static char *output_file = "/dev/stdout";  /* gawk output redirection */
-char *dgawk_Prompt = NULL;          /* initialized in interpret */
+char *dgawk_Prompt = NULL;          /* initialized in do_debug */
 static int list_size = DEFAULT_LISTSIZE;   /* # of lines that 'list' prints */
 static int do_trace = FALSE;
 static int do_save_history = TRUE;
@@ -485,11 +484,11 @@ source_find(char *src)
                        return s;
        }
 
-       path = find_source(src, &sbuf, &errno_val);
+       path = find_source(src, & sbuf, & errno_val, FALSE);
        if (path != NULL) {
                for (s = srcfiles->next; s != srcfiles; s = s->next) {
                        if ((s->stype == SRC_FILE || s->stype == SRC_INC)
-                           && files_are_same(path, s)) {
+                                       && files_are_same(path, s)) {
                                efree(path);
                                return s;
                        }
@@ -2722,10 +2721,10 @@ initialize_readline()
 #endif
 
 
-/* interpret --- debugger entry point */
+/* debug_prog --- debugger entry point */
 
 int
-interpret(INSTRUCTION *pc)
+debug_prog(INSTRUCTION *pc)
 {
        char *run;
 
@@ -2775,7 +2774,7 @@ interpret(INSTRUCTION *pc)
                        (void) do_run(NULL, 0);
 
        } else if (command_file != NULL) {
-               /* run commands from a file (--command=file  or -R file) */
+               /* run commands from a file (--debug=file  or -D file) */
                int fd;
                fd = open_readfd(command_file);
                if (fd == INVALID_HANDLE) {
@@ -2922,7 +2921,7 @@ do_run(CMDARG *arg ATTRIBUTE_UNUSED, int cmd 
ATTRIBUTE_UNUSED)
        prog_running = TRUE;
        fatal_tag_valid = TRUE;
        if (setjmp(fatal_tag) == 0)
-               (void) r_interpret(code_block);
+               (void) interpret(code_block);
 
        fatal_tag_valid = FALSE;
        prog_running = FALSE;
@@ -5377,7 +5376,7 @@ execute_code(volatile INSTRUCTION *code)
 
        PUSH_BINDING(fatal_tag_stack, fatal_tag, fatal_tag_valid);
        if (setjmp(fatal_tag) == 0) {
-               (void) r_interpret((INSTRUCTION *) code);
+               (void) interpret((INSTRUCTION *) code);
                r = POP_SCALAR();
        } else  /* fatal error */
                (void) unwind_stack(save_stack_size);
@@ -5517,7 +5516,7 @@ do_eval(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
        }
 
        /* always destroy symbol "@eval", however destroy all newly installed
-        * globals only if fatal error in r_interpret (r == NULL).
+        * globals only if fatal error (execute_code() returing NULL).
         */
 
        pop_context();  /* switch to prev context */
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 3a9a991..7dda7e1 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,11 @@
+2011-12-21         John Haque     <address@hidden>
+
+       * gawk.texi: Updated sections on profiling and debugging
+       after merging the exes. Document new options --debug and
+       --load, and add a sub-section on loading extension library.
+       * gawk.1: Same.
+       * awkcard.in: Same.
+
 2011-12-06         Arnold D. Robbins     <address@hidden>
 
        * gawk.texi: Various typo fixes from mailing list.
diff --git a/doc/awkcard.in b/doc/awkcard.in
index 1c4d191..862c307 100644
--- a/doc/awkcard.in
+++ b/doc/awkcard.in
@@ -25,7 +25,6 @@
 .\" Strings to save typing
 .ds AK \*(FCawk\*(FR
 .ds GK \*(FCgawk\*(FR
-.ds PK \*(FCpgawk\*(FR
 .ds NK Bell Labs \*(FCawk\*(FR
 .ds MK \*(FCmawk\*(FR
 .\"
@@ -253,6 +252,9 @@ their types and final values to
 If no \*(FIfile\*(FR
 is provided, \*(FCgawk\*(FR
 uses \*(FCawkvars.out\*(FR.
+.TI "\*(FC\-D\*(FR[\*(FC\*(FIfile\*(FR], 
\*(FC\-\^\-debug\*(FR[\*(FC=\*(FIfile\*(FR]
+Enable debugging of program. Optionally read stored commands
+from \*(FIfile\*(FR.
 .TI "\*(FC-e '\*(FItext\*(FC'\*(FR, \*(FC\-\^\-source '\*(FItext\*(FC'\*(FR
 Use \*(FItext\*(FR as AWK program source code.
 .TI "\*(FC\-E \*(FIfile\*(FR, \*(FC\-\^\-exec \*(FIfile\*(FR
@@ -268,6 +270,8 @@ for localization.
 .TI "\*(FC\-h\*(FR, \*(FC\-\^\-help\*(FR
 Print a short summary of the available
 options on \*(FCstdout\*(FR, then exit zero.
+.TI "\*(FC\-l \*(FIlib\*(FR, \*(FC\-\^\-load \*(FIlib\*(FR
+Load dynamic extension \*(FIlib\fP.
 .TI "\*(FC\-L \*(FR[\*(FC\*(FIvalue\*(FR], 
\*(FC\-\^\-lint\*(FR[\*(FC=\*(FIvalue\*(FR]
 Warn about dubious or non-portable constructs.
 If \*(FIvalue\*(FR is
@@ -282,21 +286,18 @@ Recognize octal and hexadecimal values in input data.
 \*(FIUse this option with great caution!\*(FR
 .TI "\*(FC\-N\*(FR, \*(FC\-\^\-use\-lc\-numeric\*(FR
 Force use of the locale's decimal point character when parsing input data.
+.TI "\*(FC\-o\*(FR[\*(FC\*(FIfile\*(FR], 
\*(FC\-\^\-pretty-print\*(FR[\*(FC=\*(FIfile\*(FR]
+Output a pretty printed version of the program to \*(FIfile\*(FR
+(default: \*(FCawkprof.out\*(FR).
 .TI "\*(FC\-O\*(FR, \*(FC\-\^\-optimize\*(FR
 Enable some internal optimizations.
 .TI "\*(FC\-p\*(FR[\*(FC\*(FIfile\*(FR], 
\*(FC\-\^\-profile\*(FR[\*(FC=\*(FIfile\*(FR]
 Send profiling data to \*(FIfile\*(FR
 (default: \*(FCawkprof.out\*(FR).
-With \*(GK,
-the profile is just a ``pretty printed'' version of the program.
-With \*(PK,
-the profile contains execution counts in the left margin
+The profile contains execution counts in the left margin
 of each statement in the program.
 .TI "\*(FC\-P\*(FR, \*(FC\-\^\-posix\*(FR
 Disable common and GNU extensions.
-.TI "\*(FC\-R \*(FIfile\*(FR, \*(FC\-\^\-command \*(FIfile\*(FR"
-\*(FCdgawk\*(FR only.
-Read stored debugger commands from \*(FIfile\*(FR.
 .TI "\*(FC\-r\*(FR, \*(FC\-\^\-re\-interval\*(FR
 Enable \*(FIinterval expressions\*(FR in regular
 expression matching (see \fHRegular
@@ -382,10 +383,10 @@ The options may be abbreviated using just the first 
letter, e.g.,
 and so on.\*(CB
 .EB "\s+2\f(HBCOMMAND LINE ARGUMENTS (\*(MK\f(HB)\*(FR\s0"
 .sp .7
-.\" --- Signals (pgawk)
+.\" --- Signals (gawk --profile)
 .ES
 .fi
-\*(CD\*(PK accepts two signals.
+\*(CD\*(GK accepts two signals while profiling.
 \*(FCSIGUSR1\fP dumps a profile and function call stack to the
 profile file.  It then continues to run.
 \*(FCSIGHUP\fP is similar, but exits.\*(CB
diff --git a/doc/gawk.1 b/doc/gawk.1
index e26f9a2..c171acb 100644
--- a/doc/gawk.1
+++ b/doc/gawk.1
@@ -33,30 +33,6 @@ gawk \- pattern scanning and processing language
 ]
 .I program-text
 file .\|.\|.
-.sp
-.B pgawk
-[ \*(PX or \*(GN style options ]
-.B \-f
-.I program-file
-[
-.B \-\^\-
-] file .\|.\|.
-.br
-.B pgawk
-[ \*(PX or \*(GN style options ]
-[
-.B \-\^\-
-]
-.I program-text
-file .\|.\|.
-.sp
-.B dgawk
-[ \*(PX or \*(GN style options ]
-.B \-f
-.I program-file
-[
-.B \-\^\-
-] file .\|.\|.
 .SH DESCRIPTION
 .I Gawk
 is the \*(GN Project's implementation of the \*(AK programming language.
@@ -84,27 +60,31 @@ and
 .B ARGV
 pre-defined \*(AK variables.
 .PP
-.I Pgawk
-is the profiling version of
-.IR gawk .
-It is identical in every way to
-.IR gawk ,
-except that programs run more slowly,
-and it automatically produces an execution profile in the file
+When 
+.I gawk
+is invoked with the
+.B \-\^\-profile
+option, it starts gathering profiling statistics
+from the execution of the program.
+.I Gawk
+runs more slowly in this mode, and automatically produces an execution
+profile in the file
 .B awkprof.out
 when done.
 See the
 .B \-\^\-profile
 option, below.
 .PP
-.I Dgawk
-is an
-.I awk
-debugger. Instead of running the program directly, it loads the
+.I Gawk
+also has an integrated debugger. An interactive debugging session can
+be started by supplying the
+.B \-\^\-debug
+option to the command line. In this mode of execution,
+.I gawk
+loads the
 AWK source code and then prompts for debugging commands.
-Unlike
-.IR gawk " and " pgawk ", " dgawk
-only processes AWK program source provided with the
+.I Gawk
+can only debug AWK program source provided with the
 .B \-f
 option.
 The debugger is documented in \*(EP.
@@ -273,6 +253,18 @@ names like
 and so on.)
 .TP
 .PD 0
+\fB\-D\fR[\fIfile\fR]
+.TP
+.PD
+\fB\-\^\-debug\fR[\fB=\fIfile\fR]
+Enable debugging of \*(AK programs.
+By default, the debugger reads commands interactively from the terminal.
+The optional
+.IR file
+argument can be used to specify a file with a list
+of commands for the debugger to execute non-interactively.
+.TP
+.PD 0
 .BI "\-e " program-text
 .TP
 .PD
@@ -331,6 +323,21 @@ the standard output.
 these options cause an immediate, successful exit.)
 .TP
 .PD 0
+.BI "\-l " lib
+.TP
+.PD
+.BI \-\^\-load " lib"
+Load a shared library
+.IR lib .
+This searches for the library using the
+.B AWKPATH
+environment variable. The suffix 
+.I .so
+in the library name is optional, and
+the library initialization routine is expected to be named
+.BR dlload() .
+.TP
+.PD 0
 .BR "\-L " [ \fIvalue\fR ]
 .TP
 .PD
@@ -387,12 +394,28 @@ users.
 ..
 .TP
 .PD 0
+\fB\-o\fR[\fIfile\fR]
+.TP
+.PD
+\fB\-\^\-pretty-print\fR[\fB=\fIfile\fR]
+Output a pretty printed version of the program to
+.IR file .
+If no
+.I file
+is provided,
+.I gawk
+uses a file named
+.B awkprof.out
+in the current directory.
+.TP
+.PD 0
 .B \-O
 .TP
 .PD
 .B \-\^\-optimize
 Enable optimizations upon the internal representation of the program.
-Currently, this includes just simple constant-folding. The
+Currently, this includes simple constant-folding, and tail call
+elimination for recursive functions. The
 .I gawk
 maintainer hopes to add additional optimizations over time.
 .TP
@@ -401,16 +424,11 @@ maintainer hopes to add additional optimizations over 
time.
 .TP
 .PD
 \fB\-\^\-profile\fR[\fB=\fIprof_file\fR]
-Send profiling data to
+Start a profiling session, and send the profiling data to
 .IR prof_file .
 The default is
 .BR awkprof.out .
-When run with
-.IR gawk ,
-the profile is just a \*(lqpretty printed\*(rq version of the program.
-When run with
-.IR pgawk ,
-the profile contains execution counts of each statement in the program
+The profile contains execution counts of each statement in the program
 in the left margin and function call counts for each user-defined function.
 .TP
 .PD 0
@@ -482,15 +500,6 @@ They are enabled by default, but this option remains for 
use with
 .BR \-\^-traditional .
 .TP
 .PD 0
-.B \-R
-.TP
-.PD
-.BI \-\^\-command " file"
-.I Dgawk
-only.  Read stored debugger commands from
-.IR file .
-.TP
-.PD 0
 .BI \-S
 .TP
 .PD
@@ -3122,8 +3131,9 @@ Using this feature at the C level is not pretty, but
 it is unlikely to go away. Additional mechanisms may
 be added at some point.
 .SH SIGNALS
-.I pgawk
-accepts two signals.
+The
+.I gawk
+profiler accepts two signals.
 .B SIGUSR1
 causes it to dump a profile and function call stack to the
 profile file, which is either
@@ -3133,7 +3143,7 @@ or whatever file was named with the
 option.  It then continues to run.
 .B SIGHUP
 causes
-.I pgawk
+.I gawk
 to dump the profile and function call stack and then exit.
 .SH INTERNATIONALIZATION
 .PP
diff --git a/doc/gawk.info b/doc/gawk.info
index a8b6450..06b8e11 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -94,7 +94,7 @@ texts being (a) (see below), and with the Back-Cover Texts 
being (b)
 * Library Functions::              A Library of `awk' Functions.
 * Sample Programs::                Many `awk' programs with complete
                                    explanations.
-* Debugger::                       The `dgawk' debugger.
+* Debugger::                       The `gawk' debugger.
 * Language History::               The evolution of the `awk'
                                    language.
 * Installation::                   Installing `gawk' under various
@@ -417,23 +417,23 @@ texts being (a) (see below), and with the Back-Cover 
Texts being (b)
 * Anagram Program::                Finding anagrams from a dictionary.
 * Signature Program::              People do amazing things with too much time
                                    on their hands.
-* Debugging::                      Introduction to `dgawk'.
-* Debugging Concepts::             Debugging In General.
+* Debugging::                      Introduction to `gawk' Debugger.
+* Debugging Concepts::             Debugging in General.
 * Debugging Terms::                Additional Debugging Concepts.
 * Awk Debugging::                  Awk Debugging.
-* Sample dgawk session::           Sample `dgawk' session.
-* dgawk invocation::               `dgawk' Invocation.
-* Finding The Bug::                Finding The Bug.
-* List of Debugger Commands::      Main `dgawk' Commands.
-* Breakpoint Control::             Control of breakpoints.
-* Dgawk Execution Control::        Control of execution.
-* Viewing And Changing Data::      Viewing and changing data.
-* Dgawk Stack::                    Dealing with the stack.
-* Dgawk Info::                     Obtaining information about the program and
-                                   the debugger state.
-* Miscellaneous Dgawk Commands::   Miscellaneous Commands.
+* Sample Debugging Session::       Sample Debugging Session.
+* Debugger Invocation::            How to Start the Debugger.
+* Finding The Bug::                Finding the Bug.
+* List of Debugger Commands::      Main Commands.
+* Breakpoint Control::             Control of Breakpoints.
+* Debugger Execution Control::     Control of Execution.
+* Viewing And Changing Data::      Viewing and Changing Data.
+* Execution Stack::                Dealing with the Stack.
+* Debugger Info::                  Obtaining Information about the Program and
+                                   the Debugger State.
+* Miscellaneous Debugger Commands:: Miscellaneous Commands.
 * Readline Support::               Readline Support.
-* Dgawk Limitations::              Limitations and future plans.
+* Limitations::                    Limitations and Future Plans.
 * V7/SVR3.1::                      The major changes between V7 and System V
                                    Release 3.1.
 * SVR4::                           Minor changes between System V Releases 3.1
@@ -489,6 +489,7 @@ texts being (a) (see below), and with the Back-Cover Texts 
being (b)
 * Internals::                      A brief look at some `gawk'
                                    internals.
 * Plugin License::                 A note about licensing.
+* Loading Extensions::             How to load dynamic extensions.
 * Sample Library::                 A example of new functions.
 * Internal File Description::      What the new functions will do.
 * Internal File Ops::              The code for internal file operations.
@@ -849,7 +850,7 @@ and profile your `awk' programs.
 sample `awk' programs.  Reading them allows you to see `awk' solving
 real problems.
 
-   *note Debugger::, describes the `awk' debugger, `dgawk'.
+   *note Debugger::, describes the `awk' debugger.
 
    *note Language History::, describes how the `awk' language has
 evolved since its first release to present.  It also describes how
@@ -2215,6 +2216,15 @@ The following list describes options mandated by the 
POSIX standard:
      particularly easy mistake to make with simple variable names like
      `i', `j', etc.)
 
+`-D[FILE]'
+`--debug=[FILE]'
+     Enable debugging of `awk' programs (*note Debugging::).  By
+     default, the debugger reads commands interactively from the
+     terminal.  The optional FILE argument allows you to specify a file
+     with a list of commands for the debugger to execute
+     non-interactively.  No space is allowed between the `-D' and FILE,
+     if FILE is supplied.
+
 `-e PROGRAM-TEXT'
 `--source PROGRAM-TEXT'
      Provide program source code in the PROGRAM-TEXT.  This option
@@ -2257,6 +2267,13 @@ The following list describes options mandated by the 
POSIX standard:
      Print a "usage" message summarizing the short and long style
      options that `gawk' accepts and then exit.
 
+`-l LIB'
+`--load LIB'
+     Load a shared library LIB. This searches for the library using the
+     `AWKPATH' environment variable. The suffix `.so' in the library
+     name is optional.  The library initialization routine should be
+     named `dlload()'.
+
 `-L [value]'
 `--lint[=value]'
      Warn about constructs that are dubious or nonportable to other
@@ -2289,6 +2306,14 @@ The following list describes options mandated by the 
POSIX standard:
      Force the use of the locale's decimal point character when parsing
      numeric input data (*note Locales::).
 
+`-o[FILE]'
+`--pretty-print[=FILE]'
+     Enable pretty-printing of `awk' programs.  By default, output
+     program is created in a file named `awkprof.out'.  The optional
+     FILE argument allows you to specify a different file name for the
+     output.  No space is allowed between the `-o' and FILE, if FILE is
+     supplied.
+
 `-O'
 `--optimize'
      Enable some optimizations on the internal representation of the
@@ -2304,10 +2329,9 @@ The following list describes options mandated by the 
POSIX standard:
      for the profile file.  No space is allowed between the `-p' and
      FILE, if FILE is supplied.
 
-     When run with `gawk', the profile is just a "pretty printed"
-     version of the program.  When run with `pgawk', the profile
-     contains execution counts for each statement in the program in the
-     left margin, and function call counts for each function.
+     The profile contains execution counts for each statement in the
+     program in the left margin, and function call counts for each
+     function.
 
 `-P'
 `--posix'
@@ -2341,11 +2365,6 @@ The following list describes options mandated by the 
POSIX standard:
      remains both for backward compatibility, and for use in
      combination with the `--traditional' option.
 
-`-R FILE'
-`--command=FILE'
-     `dgawk' only.  Read `dgawk' debugger options and commands from
-     FILE.  *Note Dgawk Info::, for more information.
-
 `-S'
 `--sandbox'
      Disable the `system()' function, input redirections with `getline',
@@ -14115,25 +14134,22 @@ File: gawk.info,  Node: Profiling,  Prev: TCP/IP 
Networking,  Up: Advanced Featu
 ==================================
 
 You may produce execution traces of your `awk' programs.  This is done
-with a specially compiled version of `gawk', called `pgawk' ("profiling
-`gawk'").
-
-   `pgawk' is identical in every way to `gawk', except that when it has
-finished running, it creates a profile of your program in a file named
-`awkprof.out'.  Because it is profiling, it also executes up to 45%
+by passing the option `--profile' to `gawk'.  When `gawk' has finished
+running, it creates a profile of your program in a file named
+`awkprof.out'. Because it is profiling, it also executes up to 45%
 slower than `gawk' normally does.
 
    As shown in the following example, the `--profile' option can be
-used to change the name of the file where `pgawk' will write the
-profile:
+used to change the name of the file where `gawk' will write the profile:
 
-     pgawk --profile=myprog.prof -f myprog.awk data1 data2
+     gawk --profile=myprog.prof -f myprog.awk data1 data2
 
-In the above example, `pgawk' places the profile in `myprog.prof'
+In the above example, `gawk' places the profile in `myprog.prof'
 instead of in `awkprof.out'.
 
    Here is a sample session showing a simple `awk' program, its input
-data, and the results from running `pgawk'.  First, the `awk' program:
+data, and the results from running `gawk' with the `--profile' option.
+First, the `awk' program:
 
      BEGIN { print "First BEGIN rule" }
 
@@ -14169,9 +14185,9 @@ data, and the results from running `pgawk'.  First, the 
`awk' program:
      foo
      junk
 
-   Here is the `awkprof.out' that results from running `pgawk' on this
-program and data (this example also illustrates that `awk' programmers
-sometimes have to work late):
+   Here is the `awkprof.out' that results from running the `gawk'
+profiler on this program and data (this example also illustrates that
+`awk' programmers sometimes have to work late):
 
              # gawk profile, created Sun Aug 13 00:00:15 2000
 
@@ -14260,14 +14276,14 @@ output.  They are as follows:
      redirection.  Similarly, if the target of a redirection isn't a
      scalar, it gets parenthesized.
 
-   * `pgawk' supplies leading comments in front of the `BEGIN' and
-     `END' rules, the pattern/action rules, and the functions.
+   * `gawk' supplies leading comments in front of the `BEGIN' and `END'
+     rules, the pattern/action rules, and the functions.
 
 
    The profiled version of your program may not look exactly like what
-you typed when you wrote it.  This is because `pgawk' creates the
+you typed when you wrote it.  This is because `gawk' creates the
 profiled version by "pretty printing" its internal representation of
-the program.  The advantage to this is that `pgawk' can produce a
+the program.  The advantage to this is that `gawk' can produce a
 standard representation.  The disadvantage is that all source-code
 comments are lost, as are the distinctions among multiple `BEGIN',
 `END', `BEGINFILE', and `ENDFILE' rules.  Also, things such as:
@@ -14282,21 +14298,23 @@ come out as:
 
 which is correct, but possibly surprising.
 
-   Besides creating profiles when a program has completed, `pgawk' can
+   Besides creating profiles when a program has completed, `gawk' can
 produce a profile while it is running.  This is useful if your `awk'
 program goes into an infinite loop and you want to see what has been
-executed.  To use this feature, run `pgawk' in the background:
+executed.  To use this feature, run `gawk' with the `--profile' option
+in the background:
 
-     $ pgawk -f myprog &
+     $ gawk --profile -f myprog &
      [1] 13992
 
 The shell prints a job number and process ID number; in this case,
-13992.  Use the `kill' command to send the `USR1' signal to `pgawk':
+13992.  Use the `kill' command to send the `USR1' signal to `gawk':
 
      $ kill -USR1 13992
 
 As usual, the profiled version of the program is written to
-`awkprof.out', or to a different file if you use the `--profile' option.
+`awkprof.out', or to a different file if one specified with the
+`--profile' option.
 
    Along with the regular profile, as shown earlier, the profile
 includes a trace of any active functions:
@@ -14308,22 +14326,22 @@ includes a trace of any active functions:
      #   1. foo
      # -- main --
 
-   You may send `pgawk' the `USR1' signal as many times as you like.
+   You may send `gawk' the `USR1' signal as many times as you like.
 Each time, the profile and function call trace are appended to the
 output profile file.
 
-   If you use the `HUP' signal instead of the `USR1' signal, `pgawk'
+   If you use the `HUP' signal instead of the `USR1' signal, `gawk'
 produces the profile and the function call trace and then exits.
 
-   When `pgawk' runs on MS-Windows systems, it uses the `INT' and
-`QUIT' signals for producing the profile and, in the case of the `INT'
-signal, `pgawk' exits.  This is because these systems don't support the
-`kill' command, so the only signals you can deliver to a program are
-those generated by the keyboard.  The `INT' signal is generated by the
+   When `gawk' runs on MS-Windows systems, it uses the `INT' and `QUIT'
+signals for producing the profile and, in the case of the `INT' signal,
+`gawk' exits.  This is because these systems don't support the `kill'
+command, so the only signals you can deliver to a program are those
+generated by the keyboard.  The `INT' signal is generated by the
 `Ctrl-<C>' or `Ctrl-<BREAK>' key, while the `QUIT' signal is generated
 by the `Ctrl-<\>' key.
 
-   Finally, regular `gawk' also accepts the `--profile' option.  When
+   Finally, `gawk' also accepts another option `--pretty-print'.  When
 called this way, `gawk' "pretty prints" the program into `awkprof.out',
 without any execution counts.
 
@@ -18702,45 +18720,46 @@ supplies the following copyright terms:
 
 File: gawk.info,  Node: Debugger,  Next: Language History,  Prev: Sample 
Programs,  Up: Top
 
-14 `dgawk': The `awk' Debugger
-******************************
+14 Debugging `awk' Programs
+***************************
 
 It would be nice if computer programs worked perfectly the first time
 they were run, but in real life, this rarely happens for programs of
 any complexity.  Thus, most programming languages have facilities
 available for "debugging" programs, and now `awk' is no exception.
 
-   The `dgawk' debugger is purposely modeled after the GNU Debugger
+   The `gawk' debugger is purposely modeled after the GNU Debugger
 (GDB) (http://www.gnu.org/software/gdb/) command-line debugger.  If you
-are familiar with GDB, learning `dgawk' is easy.
+are familiar with GDB, learning how to use `gawk' for debugging your
+program is easy.
 
 * Menu:
 
-* Debugging::                   Introduction to `dgawk'.
-* Sample dgawk session::        Sample `dgawk' session.
-* List of Debugger Commands::   Main `dgawk' Commands.
-* Readline Support::            Readline Support.
-* Dgawk Limitations::           Limitations and future plans.
+* Debugging::                   Introduction to `gawk' debugger.
+* Sample Debugging Session::    Sample debugging session.
+* List of Debugger Commands::   Main debugger commands.
+* Readline Support::            Readline support.
+* Limitations::                 Limitations and future plans.
 
 
-File: gawk.info,  Node: Debugging,  Next: Sample dgawk session,  Up: Debugger
+File: gawk.info,  Node: Debugging,  Next: Sample Debugging Session,  Up: 
Debugger
 
-14.1 Introduction to `dgawk'
-============================
+14.1 Introduction to `gawk' Debugger
+====================================
 
 This minor node introduces debugging in general and begins the
 discussion of debugging in `gawk'.
 
 * Menu:
 
-* Debugging Concepts::          Debugging In General.
+* Debugging Concepts::          Debugging in General.
 * Debugging Terms::             Additional Debugging Concepts.
 * Awk Debugging::               Awk Debugging.
 
 
 File: gawk.info,  Node: Debugging Concepts,  Next: Debugging Terms,  Up: 
Debugging
 
-14.1.1 Debugging In General
+14.1.1 Debugging in General
 ---------------------------
 
 (If you have used debuggers in other languages, you may want to skip
@@ -18784,9 +18803,8 @@ File: gawk.info,  Node: Debugging Terms,  Next: Awk 
Debugging,  Prev: Debugging
 ------------------------------------
 
 Before diving in to the details, we need to introduce several important
-concepts that apply to just about all debuggers, including `dgawk'.
-The following list defines terms used throughout the rest of this
-major node.
+concepts that apply to just about all debuggers.  The following list
+defines terms used throughout the rest of this major node.
 
 "Stack Frame"
      Programs generally call functions during the course of their
@@ -18804,11 +18822,11 @@ major node.
      needed to manage the call stack.  This data area is termed a
      "stack frame".
 
-     `gawk' also follows this model, and `dgawk' gives you access to
-     the call stack and to each stack frame. You can see the call
-     stack, as well as from where each function on the stack was
-     invoked. Commands that print the call stack print information about
-     each stack frame (as detailed later on).
+     `gawk' also follows this model, and gives you access to the call
+     stack and to each stack frame. You can see the call stack, as well
+     as from where each function on the stack was invoked. Commands
+     that print the call stack print information about each stack frame
+     (as detailed later on).
 
 "Breakpoint"
      During debugging, you often wish to let the program run until it
@@ -18853,54 +18871,57 @@ individual primitive instructions carried out by the 
higher-level `awk'
 commands.
 
 
-File: gawk.info,  Node: Sample dgawk session,  Next: List of Debugger 
Commands,  Prev: Debugging,  Up: Debugger
+File: gawk.info,  Node: Sample Debugging Session,  Next: List of Debugger 
Commands,  Prev: Debugging,  Up: Debugger
 
-14.2 Sample `dgawk' session
-===========================
+14.2 Sample Debugging Session
+=============================
 
-In order to illustrate the use of `dgawk', let's look at a sample
-debugging session.  We will use the `awk' implementation of the POSIX
-`uniq' command described earlier (*note Uniq Program::) as our example.
+In order to illustrate the use of `gawk' as a debugger, let's look at a
+sample debugging session.  We will use the `awk' implementation of the
+POSIX `uniq' command described earlier (*note Uniq Program::) as our
+example.
 
 * Menu:
 
-* dgawk invocation::            `dgawk' Invocation.
-* Finding The Bug::             Finding The Bug.
+* Debugger Invocation::         How to Start the Debugger.
+* Finding The Bug::             Finding the Bug.
 
 
-File: gawk.info,  Node: dgawk invocation,  Next: Finding The Bug,  Up: Sample 
dgawk session
+File: gawk.info,  Node: Debugger Invocation,  Next: Finding The Bug,  Up: 
Sample Debugging Session
 
-14.2.1 `dgawk' Invocation
--------------------------
+14.2.1 How to Start the Debugger
+--------------------------------
 
-Starting `dgawk' is exactly like running `awk'.  The file(s) containing
-the program and any supporting code are given on the command line as
-arguments to one or more `-f' options.  (`dgawk' is not designed to
-debug command-line programs, only programs contained in files.)  In our
-case, we call `dgawk' like this:
+Starting the debugger is almost exactly like running `awk', except you
+have to pass an additional option `--debug' or the corresponding short
+option `-D'.  The file(s) containing the program and any supporting
+code are given on the command line as arguments to one or more `-f'
+options. (`gawk' is not designed to debug command-line programs, only
+programs contained in files.)  In our case, we invoke the debugger like
+this:
 
-     $ dgawk -f getopt.awk -f join.awk -f uniq.awk inputfile
+     $ gawk -D -f getopt.awk -f join.awk -f uniq.awk inputfile
 
 where both `getopt.awk' and `uniq.awk' are in `$AWKPATH'.  (Experienced
 users of GDB or similar debuggers should note that this syntax is
-slightly different from what they are used to.  With `dgawk', the
-arguments for running the program are given in the command line to the
-debugger rather than as part of the `run' command at the debugger
+slightly different from what they are used to.  With `gawk' debugger,
+the arguments for running the program are given in the command line to
+the debugger rather than as part of the `run' command at the debugger
 prompt.)
 
    Instead of immediately running the program on `inputfile', as `gawk'
-would ordinarily do, `dgawk' merely loads all the program source files,
-compiles them internally, and then gives us a prompt:
+would ordinarily do, the debugger merely loads all the program source
+files, compiles them internally, and then gives us a prompt:
 
-     dgawk>
+     gawk>
 
 from which we can issue commands to the debugger.  At this point, no
 code has been executed.
 
 
-File: gawk.info,  Node: Finding The Bug,  Prev: dgawk invocation,  Up: Sample 
dgawk session
+File: gawk.info,  Node: Finding The Bug,  Prev: Debugger Invocation,  Up: 
Sample Debugging Session
 
-14.2.2 Finding The Bug
+14.2.2 Finding the Bug
 ----------------------
 
 Let's say that we are having a problem using (a faulty version of)
@@ -18930,27 +18951,27 @@ for a breakpoint in `uniq.awk' is at the beginning of 
the function
 `are_equal()', which compares the current line with the previous one.
 To set the breakpoint, use the `b' (breakpoint) command:
 
-     dgawk> b are_equal
+     gawk> b are_equal
      -| Breakpoint 1 set at file `awklib/eg/prog/uniq.awk', line 64
 
    The debugger tells us the file and line number where the breakpoint
 is.  Now type `r' or `run' and the program runs until it hits the
 breakpoint for the first time:
 
-     dgawk> r
+     gawk> r
      -| Starting program:
      -| Stopping in Rule ...
      -| Breakpoint 1, are_equal(n, m, clast, cline, alast, aline)
               at `awklib/eg/prog/uniq.awk':64
      -| 64          if (fcount == 0 && charcount == 0)
-     dgawk>
+     gawk>
 
    Now we can look at what's going on inside our program.  First of all,
 let's see how we got to where we are.  At the prompt, we type `bt'
-(short for "backtrace"), and `dgawk' responds with a listing of the
-current stack frames:
+(short for "backtrace"), and the debugger responds with a listing of
+the current stack frames:
 
-     dgawk> bt
+     gawk> bt
      -| #0  are_equal(n, m, clast, cline, alast, aline)
               at `awklib/eg/prog/uniq.awk':69
      -| #1  in main() at `awklib/eg/prog/uniq.awk':89
@@ -18964,9 +18985,9 @@ the key to finding the source of the problem.)
    Now that we're in `are_equal()', we can start looking at the values
 of some variables.  Let's say we type `p n' (`p' is short for "print").
 We would expect to see the value of `n', a parameter to `are_equal()'.
-Actually, `dgawk' gives us:
+Actually, the debugger gives us:
 
-     dgawk> p n
+     gawk> p n
      -| n = untyped variable
 
 In this case, `n' is an uninitialized local variable, since the
@@ -18974,13 +18995,13 @@ function was called without arguments (*note Function 
Calls::).
 
    A more useful variable to display might be the current record:
 
-     dgawk> p $0
+     gawk> p $0
      -| $0 = string ("gawk is a wonderful program!")
 
 This might be a bit puzzling at first since this is the second line of
 our test input above.  Let's look at `NR':
 
-     dgawk> p NR
+     gawk> p NR
      -| NR = number (2)
 
 So we can see that `are_equal()' was only called for the second record
@@ -18994,7 +19015,7 @@ for `NR == 1':
 
    OK, let's just check that that rule worked correctly:
 
-     dgawk> p last
+     gawk> p last
      -| last = string ("awk is a wonderful program!")
 
    Everything we have done so far has verified that the program has
@@ -19003,7 +19024,7 @@ the problem must be inside this function.  To 
investigate further, we
 must begin "stepping through" the lines of `are_equal()'.  We start by
 typing `n' (for "next"):
 
-     dgawk> n
+     gawk> n
      -| 67          if (fcount > 0) {
 
    This tells us that `gawk' is now ready to execute line 67, which
@@ -19019,15 +19040,15 @@ was false.)
    Continuing to step, we now get to the splitting of the current and
 last records:
 
-     dgawk> n
+     gawk> n
      -| 68              n = split(last, alast)
-     dgawk> n
+     gawk> n
      -| 69              m = split($0, aline)
 
    At this point, we should be curious to see what our records were
 split into, so we try to look:
 
-     dgawk> p n m alast aline
+     gawk> p n m alast aline
      -| n = number (5)
      -| m = number (5)
      -| alast = array, 5 elements
@@ -19043,19 +19064,19 @@ want to see inside the array?
 
    The first choice would be to use subscripts:
 
-     dgawk> p alast[0]
+     gawk> p alast[0]
      -| "0" not in array `alast'
 
 Oops!
 
-     dgawk> p alast[1]
+     gawk> p alast[1]
      -| alast["1"] = string ("awk")
 
-   This would be kind of slow for a 100-member array, though, so
-`dgawk' provides a shortcut (reminiscent of another language not to be
+   This would be kind of slow for a 100-member array, though, so `gawk'
+provides a shortcut (reminiscent of another language not to be
 mentioned):
 
-     dgawk> p @alast
+     gawk> p @alast
      -| alast["1"] = string ("awk")
      -| alast["2"] = string ("is")
      -| alast["3"] = string ("a")
@@ -19064,9 +19085,9 @@ mentioned):
 
    It looks like we got this far OK.  Let's take another step or two:
 
-     dgawk> n
+     gawk> n
      -| 70              clast = join(alast, fcount, n)
-     dgawk> n
+     gawk> n
      -| 71              cline = join(aline, fcount, m)
 
    Well, here we are at our error (sorry to spoil the suspense).  What
@@ -19074,7 +19095,7 @@ we had in mind was to join the fields starting from the 
second one to
 make the virtual record to compare, and if the first field was numbered
 zero, this would work.  Let's look at what we've got:
 
-     dgawk> p cline clast
+     gawk> p cline clast
      -| cline = string ("gawk is a wonderful program!")
      -| clast = string ("awk is a wonderful program!")
 
@@ -19082,9 +19103,9 @@ zero, this would work.  Let's look at what we've got:
 unaltered, input records.  A little thinking (the human brain is still
 the best debugging tool), and we realize that we were off by one!
 
-   We get out of `dgawk':
+   We get out of the debugger:
 
-     dgawk> q
+     gawk> q
      -| The program is running. Exit anyway (y/n)? y
 
 Then we get into an editor:
@@ -19095,12 +19116,13 @@ Then we get into an editor:
 and problem solved!
 
 
-File: gawk.info,  Node: List of Debugger Commands,  Next: Readline Support,  
Prev: Sample dgawk session,  Up: Debugger
+File: gawk.info,  Node: List of Debugger Commands,  Next: Readline Support,  
Prev: Sample Debugging Session,  Up: Debugger
 
-14.3 Main `dgawk' Commands
-==========================
+14.3 Main Debugger Commands
+===========================
 
-The `dgawk' command set can be divided into the following categories:
+The `gawk' debugger command set can be divided into the following
+categories:
 
    * Breakpoint control
 
@@ -19116,26 +19138,26 @@ The `dgawk' command set can be divided into the 
following categories:
 
    Each of these are discussed in the following subsections.  In the
 following descriptions, commands which may be abbreviated show the
-abbreviation on a second description line.  A `dgawk' command name may
-also be truncated if that partial name is unambiguous. `dgawk' has the
-built-in capability to automatically repeat the previous command when
-just hitting <Enter>.  This works for the commands `list', `next',
+abbreviation on a second description line.  A debugger command name may
+also be truncated if that partial name is unambiguous. The debugger has
+the built-in capability to automatically repeat the previous command
+when just hitting <Enter>.  This works for the commands `list', `next',
 `nexti', `step', `stepi' and `continue' executed without any argument.
 
 * Menu:
 
-* Breakpoint Control::          Control of breakpoints.
-* Dgawk Execution Control::     Control of execution.
-* Viewing And Changing Data::   Viewing and changing data.
-* Dgawk Stack::                 Dealing with the stack.
-* Dgawk Info::                  Obtaining information about the program and
-                                the debugger state.
-* Miscellaneous Dgawk Commands:: Miscellaneous Commands.
+* Breakpoint Control::          Control of Breakpoints.
+* Debugger Execution Control::  Control of Execution.
+* Viewing And Changing Data::   Viewing and Changing Data.
+* Execution Stack::             Dealing with the Stack.
+* Debugger Info::               Obtaining Information about the Program and
+                                the Debugger State.
+* Miscellaneous Debugger Commands:: Miscellaneous Commands.
 
 
-File: gawk.info,  Node: Breakpoint Control,  Next: Dgawk Execution Control,  
Up: List of Debugger Commands
+File: gawk.info,  Node: Breakpoint Control,  Next: Debugger Execution Control, 
 Up: List of Debugger Commands
 
-14.3.1 Control Of Breakpoints
+14.3.1 Control of Breakpoints
 -----------------------------
 
 As we saw above, the first thing you probably want to do in a debugging
@@ -19163,10 +19185,10 @@ controlling breakpoints are:
      it from the breakpoint list using the `delete' command.
 
      With a breakpoint, you may also supply a condition.  This is an
-     `awk' expression (enclosed in double quotes) that `dgawk'
+     `awk' expression (enclosed in double quotes) that the debugger
      evaluates whenever the breakpoint is reached. If the condition is
-     true, then `dgawk' stops execution and prompts for a command.
-     Otherwise, `dgawk' continues executing the program.
+     true, then the debugger stops execution and prompts for a command.
+     Otherwise, it continues executing the program.
 
 `clear' [[FILENAME`:']N | FUNCTION]
      Without any argument, delete any breakpoint at the next instruction
@@ -19188,12 +19210,13 @@ controlling breakpoints are:
 
 `condition' N `"EXPRESSION"'
      Add a condition to existing breakpoint or watchpoint N. The
-     condition is an `awk' expression that `dgawk' evaluates whenever
-     the breakpoint or watchpoint is reached. If the condition is true,
-     then `dgawk' stops execution and prompts for a command. Otherwise,
-     `dgawk' continues executing the program. If the condition
-     expression is not specified, any existing condition is removed;
-     i.e., the breakpoint or watchpoint is made unconditional.
+     condition is an `awk' expression that the debugger evaluates
+     whenever the breakpoint or watchpoint is reached. If the condition
+     is true, then the debugger stops execution and prompts for a
+     command. Otherwise, the debugger continues executing the program.
+     If the condition expression is not specified, any existing
+     condition is removed; i.e., the breakpoint or watchpoint is made
+     unconditional.
 
 `delete' [N1 N2 ...] [N-M]
 `d' [N1 N2 ...] [N-M]
@@ -19227,7 +19250,7 @@ controlling breakpoints are:
      arguments are the same as for `break'.
 
 
-File: gawk.info,  Node: Dgawk Execution Control,  Next: Viewing And Changing 
Data,  Prev: Breakpoint Control,  Up: List of Debugger Commands
+File: gawk.info,  Node: Debugger Execution Control,  Next: Viewing And 
Changing Data,  Prev: Breakpoint Control,  Up: List of Debugger Commands
 
 14.3.2 Control of Execution
 ---------------------------
@@ -19250,14 +19273,14 @@ execution of the program than we saw in our earlier 
example:
      `continue') terminates the list (an implicit `end'), and
      subsequent commands are ignored.  For example:
 
-          dgawk> commands
+          gawk> commands
           > silent
           > printf "A silent breakpoint; i = %d\n", i
           > info locals
           > set i = 10
           > continue
           > end
-          dgawk>
+          gawk>
 
 `continue' [COUNT]
 `c' [COUNT]
@@ -19290,9 +19313,9 @@ execution of the program than we saw in our earlier 
example:
 
 `run'
 `r'
-     Start/restart execution of the program. When restarting, `dgawk'
-     retains the current breakpoints, watchpoints, command history,
-     automatic display variables, and debugger options.
+     Start/restart execution of the program. When restarting, the
+     debugger retains the current breakpoints, watchpoints, command
+     history, automatic display variables, and debugger options.
 
 `step' [COUNT]
 `s' [COUNT]
@@ -19307,7 +19330,7 @@ execution of the program than we saw in our earlier 
example:
      Execute one (or COUNT) instruction(s), stepping inside function
      calls.  (For illustration of what is meant by an "instruction" in
      `gawk', see the output shown under `dump' in *note Miscellaneous
-     Dgawk Commands::.)
+     Debugger Commands::.)
 
 `until' [[FILENAME`:']N | FUNCTION]
 `u' [[FILENAME`:']N | FUNCTION]
@@ -19317,7 +19340,7 @@ execution of the program than we saw in our earlier 
example:
      current stack frame returns.
 
 
-File: gawk.info,  Node: Viewing And Changing Data,  Next: Dgawk Stack,  Prev: 
Dgawk Execution Control,  Up: List of Debugger Commands
+File: gawk.info,  Node: Viewing And Changing Data,  Next: Execution Stack,  
Prev: Debugger Execution Control,  Up: List of Debugger Commands
 
 14.3.3 Viewing and Changing Data
 --------------------------------
@@ -19329,7 +19352,7 @@ The commands for viewing and changing variables inside 
of `gawk' are:
      of the variable or field is displayed each time the program stops.
      Each variable added to the list is identified by a unique number:
 
-          dgawk> display x
+          gawk> display x
           -| 10: x = 1
 
      displays the assigned item number, the variable name and its
@@ -19357,7 +19380,7 @@ AWK STATEMENTS
      Print the value of a `gawk' variable or field.  Fields must be
      referenced by constants:
 
-          dgawk> print $3
+          gawk> print $3
 
      This prints the third field in the input record (if the specified
      field does not exist, it prints `Null field'). A variable can be
@@ -19385,16 +19408,16 @@ AWK STATEMENTS
 
 `watch' VAR | `$'N [`"EXPRESSION"']
 `w' VAR | `$'N [`"EXPRESSION"']
-     Add variable VAR (or field `$N') to the watch list.  `dgawk' then
-     stops whenever the value of the variable or field changes. Each
-     watched item is assigned a number which can be used to delete it
-     from the watch list using the `unwatch' command.
+     Add variable VAR (or field `$N') to the watch list.  The debugger
+     then stops whenever the value of the variable or field changes.
+     Each watched item is assigned a number which can be used to delete
+     it from the watch list using the `unwatch' command.
 
      With a watchpoint, you may also supply a condition.  This is an
-     `awk' expression (enclosed in double quotes) that `dgawk'
+     `awk' expression (enclosed in double quotes) that the debugger
      evaluates whenever the watchpoint is reached. If the condition is
-     true, then `dgawk' stops execution and prompts for a command.
-     Otherwise, `dgawk' continues executing the program.
+     true, then the debugger stops execution and prompts for a command.
+     Otherwise, `gawk' continues executing the program.
 
 `undisplay' [N]
      Remove item number N (or all items, if no argument) from the
@@ -19406,9 +19429,9 @@ AWK STATEMENTS
 
 
 
-File: gawk.info,  Node: Dgawk Stack,  Next: Dgawk Info,  Prev: Viewing And 
Changing Data,  Up: List of Debugger Commands
+File: gawk.info,  Node: Execution Stack,  Next: Debugger Info,  Prev: Viewing 
And Changing Data,  Up: List of Debugger Commands
 
-14.3.4 Dealing With The Stack
+14.3.4 Dealing with the Stack
 -----------------------------
 
 Whenever you run a program which contains any function calls, `gawk'
@@ -19443,16 +19466,17 @@ are:
      frame.  Then select and print the frame.
 
 
-File: gawk.info,  Node: Dgawk Info,  Next: Miscellaneous Dgawk Commands,  
Prev: Dgawk Stack,  Up: List of Debugger Commands
+File: gawk.info,  Node: Debugger Info,  Next: Miscellaneous Debugger Commands, 
 Prev: Execution Stack,  Up: List of Debugger Commands
 
-14.3.5 Obtaining Information About The Program and The Debugger State
+14.3.5 Obtaining Information about the Program and the Debugger State
 ---------------------------------------------------------------------
 
 Besides looking at the values of variables, there is often a need to get
 other sorts of information about the state of your program and of the
-debugging environment itself.  `dgawk' has one command which provides
-this information, appropriately called `info'.  `info' is used with one
-of a number of arguments that tell it exactly what you want to know:
+debugging environment itself.  The `gawk' debugger has one command which
+provides this information, appropriately called `info'.  `info' is used
+with one of a number of arguments that tell it exactly what you want to
+know:
 
 `info' WHAT
 `i' WHAT
@@ -19480,10 +19504,10 @@ of a number of arguments that tell it exactly what 
you want to know:
     `source'
           The name of the current source file. Each time the program
           stops, the current source file is the file containing the
-          current instruction.  When `dgawk' first starts, the current
-          source file is the first file included via the `-f' option.
-          The `list FILENAME:LINENO' command can be used at any time to
-          change the current source.
+          current instruction.  When the debugger first starts, the
+          current source file is the first file included via the `-f'
+          option. The `list FILENAME:LINENO' command can be used at any
+          time to change the current source.
 
     `sources'
           List all program sources.
@@ -19507,7 +19531,7 @@ from a file.  The commands are:
 
     `history_size'
           The maximum number of lines to keep in the history file
-          `./.dgawk_history'.  The default is 100.
+          `./.gawk_history'.  The default is 100.
 
     `listsize'
           The number of lines that `list' prints. The default is 15.
@@ -19518,14 +19542,14 @@ from a file.  The commands are:
           standard output.
 
     `prompt'
-          The debugger prompt. The default is `dgawk> '.
+          The debugger prompt. The default is `gawk> '.
 
     `save_history [on | off]'
-          Save command history to file `./.dgawk_history'.  The default
+          Save command history to file `./.gawk_history'.  The default
           is `on'.
 
     `save_options [on | off]'
-          Save current options to file `./.dgawkrc' upon exit.  The
+          Save current options to file `./.gawkrc' upon exit.  The
           default is `on'.  Options are read back in to the next
           session upon startup.
 
@@ -19543,15 +19567,15 @@ from a file.  The commands are:
      ignored; they do _not_ repeat the last command.  You can't restart
      the program by having more than one `run' command in the file.
      Also, the list of commands may include additional `source'
-     commands; however, `dgawk' will not source the same file more than
-     once in order to avoid infinite recursion.
+     commands; however, the `gawk' debugger will not source the same
+     file more than once in order to avoid infinite recursion.
 
      In addition to, or instead of the `source' command, you can use
-     the `-R FILE' or `--command=FILE' command-line options to execute
+     the `-D FILE' or `--debug=FILE' command-line options to execute
      commands from a file non-interactively (*note Options::.
 
 
-File: gawk.info,  Node: Miscellaneous Dgawk Commands,  Prev: Dgawk Info,  Up: 
List of Debugger Commands
+File: gawk.info,  Node: Miscellaneous Debugger Commands,  Prev: Debugger Info, 
 Up: List of Debugger Commands
 
 14.3.6 Miscellaneous Commands
 -----------------------------
@@ -19567,7 +19591,7 @@ categories, as follows:
      partial dump of Davide Brini's obfuscated code (*note Signature
      Program::) demonstrates:
 
-          dgawk> dump
+          gawk> dump
           -|        # BEGIN
           -|
           -| [     2:0x89faef4] Op_rule             : [in_rule = BEGIN] 
[source_file = brini.awk]
@@ -19616,13 +19640,13 @@ categories, as follows:
           -| [      :0x89fa3b0] Op_after_beginfile  :
           -| [      :0x89fa388] Op_no_op            :
           -| [      :0x89fa3c4] Op_after_endfile    :
-          dgawk>
+          gawk>
 
 `help'
 `h'
-     Print a list of all of the `dgawk' commands with a short summary
-     of their usage.  `help COMMAND' prints the information about the
-     command COMMAND.
+     Print a list of all of the `gawk' debugger commands with a short
+     summary of their usage.  `help COMMAND' prints the information
+     about the command COMMAND.
 
 `list' [`-' | `+' | N | FILENAME`:'N | N-M | FUNCTION]
 `l' [`-' | `+' | N | FILENAME`:'N | N-M | FUNCTION]
@@ -19656,7 +19680,7 @@ categories, as follows:
      Exit the debugger.  Debugging is great fun, but sometimes we all
      have to tend to other obligations in life, and sometimes we find
      the bug, and are free to go on to the next one!  As we saw above,
-     if you are running a program, `dgawk' warns you if you
+     if you are running a program, the debugger warns you if you
      accidentally type `q' or `quit', to make sure you really want to
      quit.
 
@@ -19671,12 +19695,12 @@ categories, as follows:
 
 
 
-File: gawk.info,  Node: Readline Support,  Next: Dgawk Limitations,  Prev: 
List of Debugger Commands,  Up: Debugger
+File: gawk.info,  Node: Readline Support,  Next: Limitations,  Prev: List of 
Debugger Commands,  Up: Debugger
 
 14.4 Readline Support
 =====================
 
-If `dgawk' is compiled with the `readline' library, you can take
+If `gawk' is compiled with the `readline' library, you can take
 advantage of that library's command completion and history expansion
 features. The following types of completion are available:
 
@@ -19698,27 +19722,27 @@ Variable name completion
 
 
 
-File: gawk.info,  Node: Dgawk Limitations,  Prev: Readline Support,  Up: 
Debugger
+File: gawk.info,  Node: Limitations,  Prev: Readline Support,  Up: Debugger
 
 14.5 Limitations and Future Plans
 =================================
 
-We hope you find `dgawk' useful and enjoyable to work with, but as with
-any program, especially in its early releases, it still has some
-limitations.  A few which are worth being aware of are:
+We hope you find the `gawk' debugger useful and enjoyable to work with,
+but as with any program, especially in its early releases, it still has
+some limitations.  A few which are worth being aware of are:
 
-   * At this point, `dgawk' does not give a detailed explanation of
+   * At this point, the debugger does not give a detailed explanation of
      what you did wrong when you type in something it doesn't like.
      Rather, it just responds `syntax error'.  When you do figure out
      what your mistake was, though, you'll feel like a real guru.
 
-   * If you perused the dump of opcodes in *note Miscellaneous Dgawk
+   * If you perused the dump of opcodes in *note Miscellaneous Debugger
      Commands::, (or if you are already familiar with `gawk' internals),
      you will realize that much of the internal manipulation of data in
      `gawk', as in many interpreters, is done on a stack.  `Op_push',
      `Op_pop', etc., are the "bread and butter" of most `gawk' code.
-     Unfortunately, as of now, `dgawk' does not allow you to examine
-     the stack's contents.
+     Unfortunately, as of now, the `gawk' debugger does not allow you
+     to examine the stack's contents.
 
      That is, the intermediate results of expression evaluation are on
      the stack, but cannot be printed.  Rather, only variables which
@@ -19731,13 +19755,15 @@ limitations.  A few which are worth being aware of 
are:
      expressions to see if you got it right.  As an `awk' programmer,
      you are expected to know what `/[^[:alnum:][:blank:]]/' means.
 
-   * `dgawk' is designed to be used by running a program (with all its
-     parameters) on the command line, as described in *note dgawk
-     invocation::.  There is no way (as of now) to attach or "break in"
-     to a running program.  This seems reasonable for a language which
-     is used mainly for quickly executing, short programs.
+   * The `gawk' debugger is designed to be used by running a program
+     (with all its parameters) on the command line, as described in
+     *note Debugger Invocation::.  There is no way (as of now) to
+     attach or "break in" to a running program.  This seems reasonable
+     for a language which is used mainly for quickly executing, short
+     programs.
 
-   * `dgawk' only accepts source supplied with the `-f' option.
+   * The `gawk' debugger only accepts source supplied with the `-f'
+     option.
 
    Look forward to a future release when these and other missing
 features may be added, and of course feel free to try to add them
@@ -20313,7 +20339,7 @@ Info file, in approximate chronological order:
      Windows32 environments.  (This is no longer supported)
 
    * John Haque reworked the `gawk' internals to use a byte-code engine,
-     providing the `dgawk' debugger for `awk' programs.
+     providing the `gawk' debugger for `awk' programs.
 
    * Efraim Yawitz contributed the original text for *note Debugger::.
 
@@ -21330,9 +21356,10 @@ Unix `awk'
 `pawk'
      Nelson H.F. Beebe at the University of Utah has modified Brian
      Kernighan's `awk' to provide timing and profiling information.  It
-     is different from `pgawk' (*note Profiling::), in that it uses
-     CPU-based profiling, not line-count profiling.  You may find it at
-     either `ftp://ftp.math.utah.edu/pub/pawk/pawk-20030606.tar.gz' or
+     is different from `gawk' with the `--profile' option.  (*note
+     Profiling::), in that it uses CPU-based profiling, not line-count
+     profiling.  You may find it at either
+     `ftp://ftp.math.utah.edu/pub/pawk/pawk-20030606.tar.gz' or
      `http://www.math.utah.edu/pub/pawk/pawk-20030606.tar.gz'.
 
 Busybox Awk
@@ -21729,6 +21756,7 @@ is necessary when reading this minor node.
 
 * Internals::                   A brief look at some `gawk' internals.
 * Plugin License::              A note about licensing.
+* Loading Extensions::          How to load dynamic extensions.
 * Sample Library::              A example of new functions.
 
 
@@ -21928,7 +21956,7 @@ function parameter.
 just blindly copy this code.
 
 
-File: gawk.info,  Node: Plugin License,  Next: Sample Library,  Prev: 
Internals,  Up: Dynamic Extensions
+File: gawk.info,  Node: Plugin License,  Next: Loading Extensions,  Prev: 
Internals,  Up: Dynamic Extensions
 
 C.3.2 Extension Licensing
 -------------------------
@@ -21945,9 +21973,54 @@ the symbol exists in the global scope.  Something like 
this is enough:
      int plugin_is_GPL_compatible;
 
 
-File: gawk.info,  Node: Sample Library,  Prev: Plugin License,  Up: Dynamic 
Extensions
+File: gawk.info,  Node: Loading Extensions,  Next: Sample Library,  Prev: 
Plugin License,  Up: Dynamic Extensions
+
+C.3.3 Loading a Dynamic Extension
+---------------------------------
+
+There are two ways to load a dynamically linked library. The first is
+to use the builtin `extension()':
+
+     extension(libname, init_func)
+
+   where `libname' is the library to load, and `init_func' is the name
+of the initialization or bootstrap routine to run once loaded.
+
+   The second method for dynamic loading of a library is to use the
+command line option `-l':
+
+     $ gawk -l libname -f myprog
+
+   This will work only if the initialization routine is named
+`dlload()'.
+
+   If you use `extension()', the library will be loaded at run time.
+This means that the functions are available only to the rest of your
+script. If you use the command line option `-l' instead, the library
+will be loaded before `gawk' starts compiling the actual program. The
+net effect is that you can use those functions anywhere in the program.
+
+   `gawk' has a list of directories where it searches for libraries.
+By default, the list includes directories that depend upon how gawk was
+built and installed (*note AWKPATH Variable::). If you want `gawk' to
+look for libraries in your private directory, you have to tell it.  The
+way to do it is to set the `AWKPATH' environment variable (*note
+AWKPATH Variable::).  `gawk' supplies the default suffix `.so' if it is
+not present in the name of the library.  If the name of your library is
+`mylib.so', you can simply type
+
+     $ gawk -l mylib -f myprog
+
+   and `gawk' will do everything necessary to load in your library, and
+then call your `dlload()' routine.
+
+   You can always specify the library using an absolute pathname, in
+which case `gawk' will not use `AWKPATH' to search for it.
+
+
+File: gawk.info,  Node: Sample Library,  Prev: Loading Extensions,  Up: 
Dynamic Extensions
 
-C.3.3 Example: Directory and File Operation Built-ins
+C.3.4 Example: Directory and File Operation Built-ins
 -----------------------------------------------------
 
 Two useful functions that are not in `awk' are `chdir()' (so that an
@@ -21964,7 +22037,7 @@ implements these functions for `gawk' in an external 
extension library.
 
 File: gawk.info,  Node: Internal File Description,  Next: Internal File Ops,  
Up: Sample Library
 
-C.3.3.1 Using `chdir()' and `stat()'
+C.3.4.1 Using `chdir()' and `stat()'
 ....................................
 
 This minor node shows how to use the new functions at the `awk' level
@@ -22087,7 +22160,7 @@ Elements::):
 
 File: gawk.info,  Node: Internal File Ops,  Next: Using Internal File Ops,  
Prev: Internal File Description,  Up: Sample Library
 
-C.3.3.2 C Code for `chdir()' and `stat()'
+C.3.4.2 C Code for `chdir()' and `stat()'
 .........................................
 
 Here is the C code for these extensions.  They were written for
@@ -22237,7 +22310,7 @@ version.
 
 File: gawk.info,  Node: Using Internal File Ops,  Prev: Internal File Ops,  
Up: Sample Library
 
-C.3.3.3 Integrating the Extensions
+C.3.4.3 Integrating the Extensions
 ..................................
 
 Now that the code is written, it must be possible to add it at runtime
@@ -24675,8 +24748,8 @@ Index
 * ' (single quote):                      One-shot.            (line  15)
 * ' (single quote), vs. apostrophe:      Comments.            (line  27)
 * ' (single quote), with double quotes:  Quoting.             (line  53)
+* () (parentheses) <1>:                  Profiling.           (line 138)
 * () (parentheses):                      Regexp Operators.    (line  79)
-* () (parentheses), pgawk program:       Profiling.           (line 141)
 * * (asterisk), * operator, as multiplication operator: Precedence.
                                                               (line  55)
 * * (asterisk), * operator, as regexp operator: Regexp Operators.
@@ -24708,71 +24781,74 @@ Index
 * --assign option:                       Options.             (line  32)
 * --c option:                            Options.             (line  78)
 * --characters-as-bytes option:          Options.             (line  68)
-* --command option:                      Options.             (line 231)
 * --copyright option:                    Options.             (line  85)
+* --debug option:                        Options.             (line 105)
 * --disable-lint configuration option:   Additional Configuration Options.
                                                               (line   9)
 * --disable-nls configuration option:    Additional Configuration Options.
                                                               (line  24)
 * --dump-variables option <1>:           Library Names.       (line  45)
 * --dump-variables option:               Options.             (line  90)
-* --exec option:                         Options.             (line 113)
+* --exec option:                         Options.             (line 122)
 * --field-separator option:              Options.             (line  21)
 * --file option:                         Options.             (line  25)
 * --gen-pot option <1>:                  String Extraction.   (line   6)
-* --gen-pot option:                      Options.             (line 135)
-* --help option:                         Options.             (line 142)
-* --L option:                            Options.             (line 245)
-* --lint option <1>:                     Options.             (line 147)
+* --gen-pot option:                      Options.             (line 144)
+* --help option:                         Options.             (line 151)
+* --L option:                            Options.             (line 263)
+* --lint option <1>:                     Options.             (line 163)
 * --lint option:                         Command Line.        (line  20)
-* --lint-old option:                     Options.             (line 245)
+* --lint-old option:                     Options.             (line 263)
+* --load option:                         Options.             (line 156)
 * --non-decimal-data option <1>:         Nondecimal Data.     (line   6)
-* --non-decimal-data option:             Options.             (line 166)
+* --non-decimal-data option:             Options.             (line 182)
 * --non-decimal-data option, strtonum() function and: Nondecimal Data.
                                                               (line  36)
-* --optimize option:                     Options.             (line 179)
-* --posix option:                        Options.             (line 199)
-* --posix option, --traditional option and: Options.          (line 218)
-* --profile option <1>:                  Profiling.           (line  15)
-* --profile option:                      Options.             (line 186)
-* --re-interval option:                  Options.             (line 224)
-* --sandbox option:                      Options.             (line 236)
+* --optimize option:                     Options.             (line 203)
+* --posix option:                        Options.             (line 222)
+* --posix option, --traditional option and: Options.          (line 241)
+* --pretty-print option:                 Options.             (line 195)
+* --profile option <1>:                  Profiling.           (line  12)
+* --profile option:                      Options.             (line 210)
+* --re-interval option:                  Options.             (line 247)
+* --sandbox option:                      Options.             (line 254)
 * --sandbox option, disabling system() function: I/O Functions.
                                                               (line  85)
 * --sandbox option, input redirection with getline: Getline.  (line  19)
 * --sandbox option, output redirection with print, printf: Redirection.
                                                               (line   6)
-* --source option:                       Options.             (line 105)
+* --source option:                       Options.             (line 114)
 * --traditional option:                  Options.             (line  78)
-* --traditional option, --posix option and: Options.          (line 218)
-* --use-lc-numeric option:               Options.             (line 174)
-* --version option:                      Options.             (line 250)
+* --traditional option, --posix option and: Options.          (line 241)
+* --use-lc-numeric option:               Options.             (line 190)
+* --version option:                      Options.             (line 268)
 * --with-whiny-user-strftime configuration option: Additional Configuration 
Options.
                                                               (line  29)
 * -b option:                             Options.             (line  68)
 * -C option:                             Options.             (line  85)
+* -D option:                             Options.             (line 105)
 * -d option:                             Options.             (line  90)
-* -E option:                             Options.             (line 113)
-* -e option:                             Options.             (line 105)
+* -E option:                             Options.             (line 122)
+* -e option:                             Options.             (line 114)
 * -F option:                             Command Line Field Separator.
                                                               (line   6)
 * -f option:                             Options.             (line  25)
 * -F option:                             Options.             (line  21)
 * -f option:                             Long.                (line  12)
-* -F option, -Ft sets FS to TAB:         Options.             (line 258)
-* -f option, on command line:            Options.             (line 263)
-* -g option:                             Options.             (line 135)
-* -h option:                             Options.             (line 142)
-* -l option:                             Options.             (line 147)
-* -N option:                             Options.             (line 174)
-* -n option:                             Options.             (line 166)
-* -O option:                             Options.             (line 179)
-* -P option:                             Options.             (line 199)
-* -p option:                             Options.             (line 186)
-* -R option:                             Options.             (line 231)
-* -r option:                             Options.             (line 224)
-* -S option:                             Options.             (line 236)
-* -V option:                             Options.             (line 250)
+* -F option, -Ft sets FS to TAB:         Options.             (line 276)
+* -f option, on command line:            Options.             (line 281)
+* -g option:                             Options.             (line 144)
+* -h option:                             Options.             (line 151)
+* -l option:                             Options.             (line 156)
+* -N option:                             Options.             (line 190)
+* -n option:                             Options.             (line 182)
+* -O option:                             Options.             (line 203)
+* -o option:                             Options.             (line 195)
+* -P option:                             Options.             (line 222)
+* -p option:                             Options.             (line 210)
+* -r option:                             Options.             (line 247)
+* -S option:                             Options.             (line 254)
+* -V option:                             Options.             (line 268)
 * -v option:                             Options.             (line  32)
 * -v option, variables, assigning:       Assignment Options.  (line  12)
 * -W option:                             Options.             (line  46)
@@ -25028,7 +25104,10 @@ Index
 * asterisk (*), *= operator:             Assignment Ops.      (line 129)
 * atan2() function:                      Numeric Functions.   (line  11)
 * awf (amazingly workable formatter) program: Glossary.       (line  25)
+* awk debugging, enabling:               Options.             (line 105)
+* awk enabling:                          Options.             (line 195)
 * awk language, POSIX version:           Assignment Ops.      (line 136)
+* awk profiling, enabling:               Options.             (line 210)
 * awk programs <1>:                      Two Rules.           (line   6)
 * awk programs <2>:                      Executable Scripts.  (line   6)
 * awk programs:                          Getting Started.     (line  12)
@@ -25044,7 +25123,6 @@ Index
 * awk programs, location of:             Options.             (line  25)
 * awk programs, one-line examples:       Very Simple.         (line  45)
 * awk programs, profiling:               Profiling.           (line   6)
-* awk programs, profiling, enabling:     Options.             (line 186)
 * awk programs, running <1>:             Long.                (line   6)
 * awk programs, running:                 Running gawk.        (line   6)
 * awk programs, running, from shell scripts: One-shot.        (line  22)
@@ -25084,7 +25162,7 @@ Index
 * AWKNUM internal type:                  Internals.           (line  19)
 * AWKPATH environment variable <1>:      PC Using.            (line  11)
 * AWKPATH environment variable:          AWKPATH Variable.    (line   6)
-* awkprof.out file:                      Profiling.           (line  10)
+* awkprof.out file:                      Profiling.           (line   6)
 * awksed.awk program:                    Simple Sed.          (line  25)
 * awkvars.out file:                      Options.             (line  90)
 * b debugger command (alias for break):  Breakpoint Control.  (line  11)
@@ -25138,12 +25216,13 @@ Index
 * backslash (\), in escape sequences, POSIX and: Escape Sequences.
                                                               (line 113)
 * backslash (\), regexp constants:       Computed Regexps.    (line  28)
-* backtrace debugger command:            Dgawk Stack.         (line  13)
+* backtrace debugger command:            Execution Stack.     (line  13)
 * BBS-list file:                         Sample Data Files.   (line   6)
 * Beebe, Nelson <1>:                     Other Versions.      (line  69)
 * Beebe, Nelson:                         Acknowledgments.     (line  60)
-* BEGIN pattern <1>:                     BEGIN/END.           (line   6)
-* BEGIN pattern <2>:                     Field Separators.    (line  44)
+* BEGIN pattern <1>:                     Profiling.           (line  62)
+* BEGIN pattern <2>:                     BEGIN/END.           (line   6)
+* BEGIN pattern <3>:                     Field Separators.    (line  44)
 * BEGIN pattern:                         Records.             (line  29)
 * BEGIN pattern, assert() user-defined function and: Assert Function.
                                                               (line  83)
@@ -25158,7 +25237,6 @@ Index
 * BEGIN pattern, OFS/ORS variables, assigning values to: Output Separators.
                                                               (line  20)
 * BEGIN pattern, operators and:          Using BEGIN/END.     (line  17)
-* BEGIN pattern, pgawk program:          Profiling.           (line  65)
 * BEGIN pattern, print statement and:    I/O And BEGIN/END.   (line  16)
 * BEGIN pattern, pwcat program:          Passwd Functions.    (line 143)
 * BEGIN pattern, running awk programs and: Cut Program.       (line  68)
@@ -25187,8 +25265,8 @@ Index
 * Boolean expressions, as patterns:      Expression Patterns. (line  41)
 * Boolean operators, See Boolean expressions: Boolean Ops.    (line   6)
 * Bourne shell, quoting rules for:       Quoting.             (line  18)
+* braces ({}):                           Profiling.           (line 134)
 * braces ({}), actions and:              Action Overview.     (line  19)
-* braces ({}), pgawk program:            Profiling.           (line 137)
 * braces ({}), statements, grouping:     Statements.          (line  10)
 * bracket expressions <1>:               Bracket Expressions. (line   6)
 * bracket expressions:                   Regexp Operators.    (line  55)
@@ -25215,7 +25293,7 @@ Index
 * Broder, Alan J.:                       Contributors.        (line  88)
 * Brown, Martin:                         Contributors.        (line  82)
 * BSD-based operating systems:           Glossary.            (line 611)
-* bt debugger command (alias for backtrace): Dgawk Stack.     (line  13)
+* bt debugger command (alias for backtrace): Execution Stack. (line  13)
 * Buening, Andreas <1>:                  Bugs.                (line  71)
 * Buening, Andreas <2>:                  Contributors.        (line  92)
 * Buening, Andreas:                      Acknowledgments.     (line  60)
@@ -25233,7 +25311,7 @@ Index
 * built-in variables, -v option, setting with: Options.       (line  40)
 * built-in variables, conveying information: Auto-set.        (line   6)
 * built-in variables, user-modifiable:   User-modified.       (line   6)
-* Busybox Awk:                           Other Versions.      (line  78)
+* Busybox Awk:                           Other Versions.      (line  79)
 * call by reference:                     Pass By Value/Reference.
                                                               (line  47)
 * call by value:                         Pass By Value/Reference.
@@ -25253,7 +25331,7 @@ Index
 * case sensitivity, regexps and <1>:     User-modified.       (line  82)
 * case sensitivity, regexps and:         Case-sensitivity.    (line   6)
 * case sensitivity, string comparisons and: User-modified.    (line  82)
-* CGI, awk scripts for:                  Options.             (line 113)
+* CGI, awk scripts for:                  Options.             (line 122)
 * character lists, See bracket expressions: Regexp Operators. (line  55)
 * character sets (machine character encodings) <1>: Glossary. (line 141)
 * character sets (machine character encodings): Ordinal Functions.
@@ -25307,7 +25385,7 @@ Index
 * command line, variables, assigning on: Assignment Options.  (line   6)
 * command-line options, processing:      Getopt Function.     (line   6)
 * command-line options, string extraction: String Extraction. (line   6)
-* commands debugger command:             Dgawk Execution Control.
+* commands debugger command:             Debugger Execution Control.
                                                               (line  10)
 * commenting:                            Comments.            (line   6)
 * commenting, backslash continuation and: Statements/Lines.   (line  76)
@@ -25384,7 +25462,7 @@ Index
 * cos() function:                        Numeric Functions.   (line  14)
 * counting:                              Wc Program.          (line   6)
 * csh utility:                           Statements/Lines.    (line  44)
-* csh utility, POSIXLY_CORRECT environment variable: Options. (line 305)
+* csh utility, POSIXLY_CORRECT environment variable: Options. (line 323)
 * csh utility, |& operator, comparison with: Two-way I/O.     (line  44)
 * ctime() user-defined function:         Function Example.    (line  72)
 * currency symbols, localization:        Explaining gettext.  (line 103)
@@ -25392,7 +25470,7 @@ Index
                                                               (line  30)
 * cut utility:                           Cut Program.         (line   6)
 * cut.awk program:                       Cut Program.         (line  45)
-* d debugger command (alias for delete): Breakpoint Control.  (line  63)
+* d debugger command (alias for delete): Breakpoint Control.  (line  64)
 * d.c., See dark corner:                 Conventions.         (line  38)
 * dark corner <1>:                       Glossary.            (line 193)
 * dark corner <2>:                       Truth Values.        (line  24)
@@ -25456,113 +25534,113 @@ Index
                                                               (line  33)
 * deadlocks:                             Two-way I/O.         (line  70)
 * debugger commands, b (break):          Breakpoint Control.  (line  11)
-* debugger commands, backtrace:          Dgawk Stack.         (line  13)
+* debugger commands, backtrace:          Execution Stack.     (line  13)
 * debugger commands, break:              Breakpoint Control.  (line  11)
-* debugger commands, bt (backtrace):     Dgawk Stack.         (line  13)
-* debugger commands, c (continue):       Dgawk Execution Control.
+* debugger commands, bt (backtrace):     Execution Stack.     (line  13)
+* debugger commands, c (continue):       Debugger Execution Control.
                                                               (line  33)
 * debugger commands, clear:              Breakpoint Control.  (line  36)
-* debugger commands, commands:           Dgawk Execution Control.
+* debugger commands, commands:           Debugger Execution Control.
                                                               (line  10)
 * debugger commands, condition:          Breakpoint Control.  (line  54)
-* debugger commands, continue:           Dgawk Execution Control.
+* debugger commands, continue:           Debugger Execution Control.
                                                               (line  33)
-* debugger commands, d (delete):         Breakpoint Control.  (line  63)
-* debugger commands, delete:             Breakpoint Control.  (line  63)
-* debugger commands, disable:            Breakpoint Control.  (line  68)
+* debugger commands, d (delete):         Breakpoint Control.  (line  64)
+* debugger commands, delete:             Breakpoint Control.  (line  64)
+* debugger commands, disable:            Breakpoint Control.  (line  69)
 * debugger commands, display:            Viewing And Changing Data.
                                                               (line   8)
-* debugger commands, down:               Dgawk Stack.         (line  21)
-* debugger commands, dump:               Miscellaneous Dgawk Commands.
+* debugger commands, down:               Execution Stack.     (line  21)
+* debugger commands, dump:               Miscellaneous Debugger Commands.
                                                               (line   9)
-* debugger commands, e (enable):         Breakpoint Control.  (line  72)
-* debugger commands, enable:             Breakpoint Control.  (line  72)
-* debugger commands, end:                Dgawk Execution Control.
+* debugger commands, e (enable):         Breakpoint Control.  (line  73)
+* debugger commands, enable:             Breakpoint Control.  (line  73)
+* debugger commands, end:                Debugger Execution Control.
                                                               (line  10)
 * debugger commands, eval:               Viewing And Changing Data.
                                                               (line  23)
-* debugger commands, f (frame):          Dgawk Stack.         (line  25)
-* debugger commands, finish:             Dgawk Execution Control.
+* debugger commands, f (frame):          Execution Stack.     (line  25)
+* debugger commands, finish:             Debugger Execution Control.
                                                               (line  39)
-* debugger commands, frame:              Dgawk Stack.         (line  25)
-* debugger commands, h (help):           Miscellaneous Dgawk Commands.
+* debugger commands, frame:              Execution Stack.     (line  25)
+* debugger commands, h (help):           Miscellaneous Debugger Commands.
                                                               (line  68)
-* debugger commands, help:               Miscellaneous Dgawk Commands.
+* debugger commands, help:               Miscellaneous Debugger Commands.
                                                               (line  68)
-* debugger commands, i (info):           Dgawk Info.          (line  12)
-* debugger commands, ignore:             Breakpoint Control.  (line  86)
-* debugger commands, info:               Dgawk Info.          (line  12)
-* debugger commands, l (list):           Miscellaneous Dgawk Commands.
+* debugger commands, i (info):           Debugger Info.       (line  13)
+* debugger commands, ignore:             Breakpoint Control.  (line  87)
+* debugger commands, info:               Debugger Info.       (line  13)
+* debugger commands, l (list):           Miscellaneous Debugger Commands.
                                                               (line  74)
-* debugger commands, list:               Miscellaneous Dgawk Commands.
+* debugger commands, list:               Miscellaneous Debugger Commands.
                                                               (line  74)
-* debugger commands, n (next):           Dgawk Execution Control.
+* debugger commands, n (next):           Debugger Execution Control.
                                                               (line  43)
-* debugger commands, next:               Dgawk Execution Control.
+* debugger commands, next:               Debugger Execution Control.
                                                               (line  43)
-* debugger commands, nexti:              Dgawk Execution Control.
+* debugger commands, nexti:              Debugger Execution Control.
                                                               (line  49)
-* debugger commands, ni (nexti):         Dgawk Execution Control.
+* debugger commands, ni (nexti):         Debugger Execution Control.
                                                               (line  49)
-* debugger commands, o (option):         Dgawk Info.          (line  56)
-* debugger commands, option:             Dgawk Info.          (line  56)
+* debugger commands, o (option):         Debugger Info.       (line  57)
+* debugger commands, option:             Debugger Info.       (line  57)
 * debugger commands, p (print):          Viewing And Changing Data.
                                                               (line  36)
 * debugger commands, print:              Viewing And Changing Data.
                                                               (line  36)
 * debugger commands, printf:             Viewing And Changing Data.
                                                               (line  54)
-* debugger commands, q (quit):           Miscellaneous Dgawk Commands.
+* debugger commands, q (quit):           Miscellaneous Debugger Commands.
                                                               (line 101)
-* debugger commands, quit:               Miscellaneous Dgawk Commands.
+* debugger commands, quit:               Miscellaneous Debugger Commands.
                                                               (line 101)
-* debugger commands, r (run):            Dgawk Execution Control.
+* debugger commands, r (run):            Debugger Execution Control.
                                                               (line  62)
-* debugger commands, return:             Dgawk Execution Control.
+* debugger commands, return:             Debugger Execution Control.
                                                               (line  54)
-* debugger commands, run:                Dgawk Execution Control.
+* debugger commands, run:                Debugger Execution Control.
                                                               (line  62)
-* debugger commands, s (step):           Dgawk Execution Control.
+* debugger commands, s (step):           Debugger Execution Control.
                                                               (line  68)
 * debugger commands, set:                Viewing And Changing Data.
                                                               (line  59)
-* debugger commands, si (stepi):         Dgawk Execution Control.
+* debugger commands, si (stepi):         Debugger Execution Control.
                                                               (line  76)
-* debugger commands, silent:             Dgawk Execution Control.
+* debugger commands, silent:             Debugger Execution Control.
                                                               (line  10)
-* debugger commands, step:               Dgawk Execution Control.
+* debugger commands, step:               Debugger Execution Control.
                                                               (line  68)
-* debugger commands, stepi:              Dgawk Execution Control.
+* debugger commands, stepi:              Debugger Execution Control.
                                                               (line  76)
-* debugger commands, t (tbreak):         Breakpoint Control.  (line  89)
-* debugger commands, tbreak:             Breakpoint Control.  (line  89)
-* debugger commands, trace:              Miscellaneous Dgawk Commands.
+* debugger commands, t (tbreak):         Breakpoint Control.  (line  90)
+* debugger commands, tbreak:             Breakpoint Control.  (line  90)
+* debugger commands, trace:              Miscellaneous Debugger Commands.
                                                               (line 110)
-* debugger commands, u (until):          Dgawk Execution Control.
+* debugger commands, u (until):          Debugger Execution Control.
                                                               (line  83)
 * debugger commands, undisplay:          Viewing And Changing Data.
                                                               (line  80)
-* debugger commands, until:              Dgawk Execution Control.
+* debugger commands, until:              Debugger Execution Control.
                                                               (line  83)
 * debugger commands, unwatch:            Viewing And Changing Data.
                                                               (line  84)
-* debugger commands, up:                 Dgawk Stack.         (line  33)
+* debugger commands, up:                 Execution Stack.     (line  33)
 * debugger commands, w (watch):          Viewing And Changing Data.
                                                               (line  67)
 * debugger commands, watch:              Viewing And Changing Data.
                                                               (line  67)
+* debugging awk programs:                Debugger.            (line   6)
 * debugging gawk, bug reports:           Bugs.                (line   9)
-* decimal point character, locale specific: Options.          (line 215)
+* decimal point character, locale specific: Options.          (line 238)
 * decrement operators:                   Increment Ops.       (line  35)
 * default keyword:                       Switch Statement.    (line   6)
 * Deifik, Scott <1>:                     Bugs.                (line  70)
 * Deifik, Scott <2>:                     Contributors.        (line  54)
 * Deifik, Scott:                         Acknowledgments.     (line  60)
-* delete debugger command:               Breakpoint Control.  (line  63)
+* delete debugger command:               Breakpoint Control.  (line  64)
 * delete statement:                      Delete.              (line   6)
 * deleting elements in arrays:           Delete.              (line   6)
 * deleting entire arrays:                Delete.              (line  39)
-* dgawk:                                 Debugger.            (line   6)
 * differences between gawk and awk:      String Functions.    (line 196)
 * differences in awk and gawk, ARGC/ARGV variables: ARGC and ARGV.
                                                               (line  88)
@@ -25633,7 +25711,7 @@ Index
                                                               (line   6)
 * directories, searching <1>:            Igawk Program.       (line 368)
 * directories, searching:                AWKPATH Variable.    (line   6)
-* disable debugger command:              Breakpoint Control.  (line  68)
+* disable debugger command:              Breakpoint Control.  (line  69)
 * display debugger command:              Viewing And Changing Data.
                                                               (line   8)
 * division:                              Arithmetic Ops.      (line  44)
@@ -25651,14 +25729,14 @@ Index
 * double quote (") <1>:                  Quoting.             (line  37)
 * double quote ("):                      Read Terminal.       (line  25)
 * double quote ("), regexp constants:    Computed Regexps.    (line  28)
-* down debugger command:                 Dgawk Stack.         (line  21)
+* down debugger command:                 Execution Stack.     (line  21)
 * Drepper, Ulrich:                       Acknowledgments.     (line  52)
 * DuBois, John:                          Acknowledgments.     (line  60)
-* dump debugger command:                 Miscellaneous Dgawk Commands.
+* dump debugger command:                 Miscellaneous Debugger Commands.
                                                               (line   9)
 * dupnode() internal function:           Internals.           (line  87)
 * dupword.awk program:                   Dupword Program.     (line  31)
-* e debugger command (alias for enable): Breakpoint Control.  (line  72)
+* e debugger command (alias for enable): Breakpoint Control.  (line  73)
 * EBCDIC:                                Ordinal Functions.   (line  45)
 * egrep utility <1>:                     Egrep Program.       (line   6)
 * egrep utility:                         Bracket Expressions. (line  24)
@@ -25674,9 +25752,10 @@ Index
 * empty pattern:                         Empty.               (line   6)
 * empty strings, See null strings:       Regexp Field Splitting.
                                                               (line  43)
-* enable debugger command:               Breakpoint Control.  (line  72)
-* end debugger command:                  Dgawk Execution Control.
+* enable debugger command:               Breakpoint Control.  (line  73)
+* end debugger command:                  Debugger Execution Control.
                                                               (line  10)
+* END pattern <1>:                       Profiling.           (line  62)
 * END pattern:                           BEGIN/END.           (line   6)
 * END pattern, assert() user-defined function and: Assert Function.
                                                               (line  75)
@@ -25688,7 +25767,6 @@ Index
 * END pattern, next/nextfile statements and: I/O And BEGIN/END.
                                                               (line  37)
 * END pattern, operators and:            Using BEGIN/END.     (line  17)
-* END pattern, pgawk program:            Profiling.           (line  65)
 * END pattern, print statement and:      I/O And BEGIN/END.   (line  16)
 * ENDFILE pattern:                       BEGINFILE/ENDFILE.   (line   6)
 * ENDFILE pattern, Boolean patterns and: Expression Patterns. (line  73)
@@ -25780,7 +25858,7 @@ Index
 * extract.awk program:                   Extract Program.     (line  78)
 * extraction, of marked strings (internationalization): String Extraction.
                                                               (line   6)
-* f debugger command (alias for frame):  Dgawk Stack.         (line  25)
+* f debugger command (alias for frame):  Execution Stack.     (line  25)
 * false, logical:                        Truth Values.        (line   6)
 * FDL (Free Documentation License):      GNU Free Documentation License.
                                                               (line   6)
@@ -25847,7 +25925,7 @@ Index
 * files, /inet6/... (gawk):              TCP/IP Networking.   (line   6)
 * files, as single records:              Records.             (line 196)
 * files, awk programs in:                Long.                (line   6)
-* files, awkprof.out:                    Profiling.           (line  10)
+* files, awkprof.out:                    Profiling.           (line   6)
 * files, awkvars.out:                    Options.             (line  90)
 * files, closing:                        I/O Functions.       (line  10)
 * files, descriptors, See file descriptors: Special FD.       (line   6)
@@ -25876,7 +25954,7 @@ Index
 * files, portable object template:       Explaining gettext.  (line  30)
 * files, portable object, converting to message object files: I18N Example.
                                                               (line  62)
-* files, portable object, generating:    Options.             (line 135)
+* files, portable object, generating:    Options.             (line 144)
 * files, processing, ARGIND variable and: Auto-set.           (line  47)
 * files, reading:                        Rewind Function.     (line   6)
 * files, reading, multiline records:     Multiple Line.       (line   6)
@@ -25885,7 +25963,7 @@ Index
 * files, source, search path for:        Igawk Program.       (line 368)
 * files, splitting:                      Split Program.       (line   6)
 * files, Texinfo, extracting programs from: Extract Program.  (line   6)
-* finish debugger command:               Dgawk Execution Control.
+* finish debugger command:               Debugger Execution Control.
                                                               (line  39)
 * Fish, Fred:                            Contributors.        (line  51)
 * fixed-width data:                      Constant Size.       (line   9)
@@ -25920,7 +25998,7 @@ Index
 * FPAT variable <1>:                     User-modified.       (line  45)
 * FPAT variable:                         Splitting By Content.
                                                               (line  26)
-* frame debugger command:                Dgawk Stack.         (line  25)
+* frame debugger command:                Execution Stack.     (line  25)
 * Free Documentation License (FDL):      GNU Free Documentation License.
                                                               (line   6)
 * Free Software Foundation (FSF) <1>:    Glossary.            (line 301)
@@ -25932,7 +26010,7 @@ Index
 * FS variable, --field-separator option and: Options.         (line  21)
 * FS variable, as null string:           Single Character Fields.
                                                               (line  20)
-* FS variable, as TAB character:         Options.             (line 211)
+* FS variable, as TAB character:         Options.             (line 234)
 * FS variable, changing value of:        Field Separators.    (line  34)
 * FS variable, running awk programs and: Cut Program.         (line  68)
 * FS variable, setting from command line: Command Line Field Separator.
@@ -25983,7 +26061,7 @@ Index
                                                               (line  71)
 * functions, user-defined:               User-defined.        (line   6)
 * functions, user-defined, calling:      Calling A Function.  (line   6)
-* functions, user-defined, counts:       Profiling.           (line 132)
+* functions, user-defined, counts:       Profiling.           (line 129)
 * functions, user-defined, library of:   Library Functions.   (line   6)
 * functions, user-defined, next/nextfile statements and <1>: Nextfile 
Statement.
                                                               (line  44)
@@ -25991,6 +26069,7 @@ Index
                                                               (line  45)
 * G-d:                                   Acknowledgments.     (line  81)
 * Garfinkle, Scott:                      Contributors.        (line  35)
+* gawk program, dynamic profiling:       Profiling.           (line 171)
 * gawk, ARGIND variable in:              Other Arguments.     (line  12)
 * gawk, awk and <1>:                     This Manual.         (line  14)
 * gawk, awk and:                         Preface.             (line  23)
@@ -26017,7 +26096,7 @@ Index
                                                               (line 139)
 * gawk, ERRNO variable in:               Getline.             (line  19)
 * gawk, escape sequences:                Escape Sequences.    (line 125)
-* gawk, extensions, disabling:           Options.             (line 199)
+* gawk, extensions, disabling:           Options.             (line 222)
 * gawk, features, adding:                Adding Code.         (line   6)
 * gawk, features, advanced:              Advanced Features.   (line   6)
 * gawk, fflush() function in:            I/O Functions.       (line  44)
@@ -26031,6 +26110,7 @@ Index
                                                               (line  26)
 * gawk, function arguments and:          Calling Built-in.    (line  16)
 * gawk, functions, adding:               Dynamic Extensions.  (line  10)
+* gawk, functions, loading:              Loading Extensions.  (line   6)
 * gawk, hexadecimal numbers and:         Nondecimal-numbers.  (line  42)
 * gawk, IGNORECASE variable in <1>:      Array Sorting Functions.
                                                               (line  81)
@@ -26081,7 +26161,7 @@ Index
 * gawk, TEXTDOMAIN variable in:          User-modified.       (line 153)
 * gawk, timestamps:                      Time Functions.      (line   6)
 * gawk, uses for:                        Preface.             (line  36)
-* gawk, versions of, information about, printing: Options.    (line 250)
+* gawk, versions of, information about, printing: Options.    (line 268)
 * gawk, VMS version of:                  VMS Installation.    (line   6)
 * gawk, word-boundary operator:          GNU Regexp Operators.
                                                               (line  63)
@@ -26141,7 +26221,7 @@ Index
 * GNU Lesser General Public License:     Glossary.            (line 397)
 * GNU long options <1>:                  Options.             (line   6)
 * GNU long options:                      Command Line.        (line  13)
-* GNU long options, printing list of:    Options.             (line 142)
+* GNU long options, printing list of:    Options.             (line 151)
 * GNU Project <1>:                       Glossary.            (line 319)
 * GNU Project:                           Manual History.      (line  11)
 * GNU/Linux <1>:                         Glossary.            (line 611)
@@ -26160,7 +26240,7 @@ Index
                                                               (line  43)
 * gsub() function, arguments of:         String Functions.    (line 462)
 * gsub() function, escape processing:    Gory Details.        (line   6)
-* h debugger command (alias for help):   Miscellaneous Dgawk Commands.
+* h debugger command (alias for help):   Miscellaneous Debugger Commands.
                                                               (line  68)
 * Hankerson, Darrel <1>:                 Contributors.        (line  61)
 * Hankerson, Darrel:                     Acknowledgments.     (line  60)
@@ -26169,13 +26249,13 @@ Index
 * Hartholz, Elaine:                      Acknowledgments.     (line  38)
 * Hartholz, Marshall:                    Acknowledgments.     (line  38)
 * Hasegawa, Isamu:                       Contributors.        (line  94)
-* help debugger command:                 Miscellaneous Dgawk Commands.
+* help debugger command:                 Miscellaneous Debugger Commands.
                                                               (line  68)
 * hexadecimal numbers:                   Nondecimal-numbers.  (line   6)
-* hexadecimal values, enabling interpretation of: Options.    (line 166)
+* hexadecimal values, enabling interpretation of: Options.    (line 182)
 * histsort.awk program:                  History Sorting.     (line  25)
 * Hughes, Phil:                          Acknowledgments.     (line  43)
-* HUP signal:                            Profiling.           (line 204)
+* HUP signal:                            Profiling.           (line 203)
 * hyphen (-), - operator:                Precedence.          (line  52)
 * hyphen (-), -- (decrement/increment) operators: Precedence. (line  46)
 * hyphen (-), -- operator:               Increment Ops.       (line  48)
@@ -26183,14 +26263,14 @@ Index
 * hyphen (-), -= operator:               Assignment Ops.      (line 129)
 * hyphen (-), filenames beginning with:  Options.             (line  59)
 * hyphen (-), in bracket expressions:    Bracket Expressions. (line  17)
-* i debugger command (alias for info):   Dgawk Info.          (line  12)
+* i debugger command (alias for info):   Debugger Info.       (line  13)
 * id utility:                            Id Program.          (line   6)
 * id.awk program:                        Id Program.          (line  30)
 * if statement <1>:                      If Statement.        (line   6)
 * if statement:                          Regexp Usage.        (line  19)
 * if statement, actions, changing:       Ranges.              (line  25)
 * igawk.sh program:                      Igawk Program.       (line 124)
-* ignore debugger command:               Breakpoint Control.  (line  86)
+* ignore debugger command:               Breakpoint Control.  (line  87)
 * IGNORECASE variable <1>:               Array Sorting Functions.
                                                               (line  81)
 * IGNORECASE variable <2>:               String Functions.    (line  29)
@@ -26218,7 +26298,7 @@ Index
 * index() function:                      String Functions.    (line 155)
 * indexing arrays:                       Array Intro.         (line  50)
 * indirect function calls:               Indirect Calls.      (line   6)
-* info debugger command:                 Dgawk Info.          (line  12)
+* info debugger command:                 Debugger Info.       (line  13)
 * initialization, automatic:             More Complex.        (line  38)
 * input files:                           Reading Files.       (line   6)
 * input files, closing:                  Close Files And Pipes.
@@ -26243,7 +26323,7 @@ Index
 * insomnia, cure for:                    Alarm Program.       (line   6)
 * installation, VMS:                     VMS Installation.    (line   6)
 * installing gawk:                       Installation.        (line   6)
-* INT signal (MS-Windows):               Profiling.           (line 207)
+* INT signal (MS-Windows):               Profiling.           (line 206)
 * int() function:                        Numeric Functions.   (line  22)
 * integers:                              Basic Data Typing.   (line  21)
 * integers, unsigned:                    Basic Data Typing.   (line  30)
@@ -26308,9 +26388,9 @@ Index
 * Jacobs, Andrew:                        Passwd Functions.    (line  90)
 * Jaegermann, Michal <1>:                Contributors.        (line  46)
 * Jaegermann, Michal:                    Acknowledgments.     (line  60)
-* Java implementation of awk:            Other Versions.      (line  96)
+* Java implementation of awk:            Other Versions.      (line  97)
 * Java programming language:             Glossary.            (line 380)
-* jawk:                                  Other Versions.      (line  96)
+* jawk:                                  Other Versions.      (line  97)
 * Jedi knights:                          Undocumented.        (line   6)
 * join() user-defined function:          Join Function.       (line  18)
 * Kahrs, Ju"rgen <1>:                    Contributors.        (line  70)
@@ -26325,10 +26405,10 @@ Index
 * Kernighan, Brian <6>:                  Acknowledgments.     (line  75)
 * Kernighan, Brian <7>:                  Conventions.         (line  34)
 * Kernighan, Brian:                      History.             (line  17)
-* kill command, dynamic profiling:       Profiling.           (line 182)
+* kill command, dynamic profiling:       Profiling.           (line 180)
 * Knights, jedi:                         Undocumented.        (line   6)
 * Kwok, Conrad:                          Contributors.        (line  35)
-* l debugger command (alias for list):   Miscellaneous Dgawk Commands.
+* l debugger command (alias for list):   Miscellaneous Debugger Commands.
                                                               (line  74)
 * labels.awk program:                    Labels Program.      (line  51)
 * languages, data-driven:                Basic High Level.    (line  83)
@@ -26354,7 +26434,7 @@ Index
 * length() function:                     String Functions.    (line 166)
 * Lesser General Public License (LGPL):  Glossary.            (line 397)
 * LGPL (Lesser General Public License):  Glossary.            (line 397)
-* libmawk:                               Other Versions.      (line 104)
+* libmawk:                               Other Versions.      (line 105)
 * libraries of awk functions:            Library Functions.   (line   6)
 * libraries of awk functions, assertions: Assert Function.    (line   6)
 * libraries of awk functions, associative arrays and: Library Names.
@@ -26392,20 +26472,22 @@ Index
 * lint checking, array subscripts:       Uninitialized Subscripts.
                                                               (line  43)
 * lint checking, empty programs:         Command Line.        (line  16)
-* lint checking, issuing warnings:       Options.             (line 147)
+* lint checking, issuing warnings:       Options.             (line 163)
 * lint checking, POSIXLY_CORRECT environment variable: Options.
-                                                              (line 289)
+                                                              (line 307)
 * lint checking, undefined functions:    Pass By Value/Reference.
                                                               (line  88)
 * LINT variable:                         User-modified.       (line  98)
 * Linux <1>:                             Glossary.            (line 611)
 * Linux <2>:                             I18N Example.        (line  55)
 * Linux:                                 Manual History.      (line  28)
-* list debugger command:                 Miscellaneous Dgawk Commands.
+* list debugger command:                 Miscellaneous Debugger Commands.
                                                               (line  74)
+* loading extension:                     Loading Extensions.  (line   6)
+* loading, library:                      Options.             (line 156)
 * local variables:                       Variable Scope.      (line   6)
 * locale categories:                     Explaining gettext.  (line  80)
-* locale decimal point character:        Options.             (line 215)
+* locale decimal point character:        Options.             (line 238)
 * locale, definition of:                 Locales.             (line   6)
 * localization:                          I18N and L10N.       (line   6)
 * localization, See internationalization, localization: I18N and L10N.
@@ -26418,7 +26500,7 @@ Index
 * long options:                          Command Line.        (line  13)
 * loops:                                 While Statement.     (line   6)
 * loops, continue statements and:        For Statement.       (line  64)
-* loops, count for header:               Profiling.           (line 126)
+* loops, count for header:               Profiling.           (line 123)
 * loops, exiting:                        Break Statement.     (line   6)
 * loops, See Also while statement:       While Statement.     (line   6)
 * Lost In Space:                         Dynamic Extensions.  (line   6)
@@ -26457,7 +26539,7 @@ Index
 * modifiers, in format specifiers:       Format Modifiers.    (line   6)
 * monetary information, localization:    Explaining gettext.  (line 103)
 * msgfmt utility:                        I18N Example.        (line  62)
-* n debugger command (alias for next):   Dgawk Execution Control.
+* n debugger command (alias for next):   Debugger Execution Control.
                                                               (line  43)
 * names, arrays/variables <1>:           Library Names.       (line   6)
 * names, arrays/variables:               Arrays.              (line  18)
@@ -26473,7 +26555,7 @@ Index
 * networks, programming:                 TCP/IP Networking.   (line   6)
 * networks, support for:                 Special Network.     (line   6)
 * newlines <1>:                          Boolean Ops.         (line  67)
-* newlines <2>:                          Options.             (line 205)
+* newlines <2>:                          Options.             (line 228)
 * newlines:                              Statements/Lines.    (line   6)
 * newlines, as field separators:         Default Field Splitting.
                                                               (line   6)
@@ -26484,7 +26566,7 @@ Index
 * newlines, separating statements in actions <1>: Statements. (line  10)
 * newlines, separating statements in actions: Action Overview.
                                                               (line  19)
-* next debugger command:                 Dgawk Execution Control.
+* next debugger command:                 Debugger Execution Control.
                                                               (line  43)
 * next statement <1>:                    Next Statement.      (line   6)
 * next statement:                        Boolean Ops.         (line  85)
@@ -26499,12 +26581,12 @@ Index
                                                               (line  26)
 * nextfile statement, user-defined functions and: Nextfile Statement.
                                                               (line  44)
-* nexti debugger command:                Dgawk Execution Control.
+* nexti debugger command:                Debugger Execution Control.
                                                               (line  49)
 * NF variable <1>:                       Auto-set.            (line 107)
 * NF variable:                           Fields.              (line  33)
 * NF variable, decrementing:             Changing Fields.     (line 107)
-* ni debugger command (alias for nexti): Dgawk Execution Control.
+* ni debugger command (alias for nexti): Debugger Execution Control.
                                                               (line  49)
 * noassign.awk program:                  Ignoring Assigns.    (line  15)
 * NODE internal type:                    Internals.           (line  23)
@@ -26549,11 +26631,11 @@ Index
 * numeric, output format:                OFMT.                (line   6)
 * numeric, strings:                      Variable Typing.     (line   6)
 * numeric, values:                       Internals.           (line  27)
-* o debugger command (alias for option): Dgawk Info.          (line  56)
+* o debugger command (alias for option): Debugger Info.       (line  57)
 * oawk utility:                          Names.               (line  17)
 * obsolete features:                     Obsolete.            (line   6)
 * octal numbers:                         Nondecimal-numbers.  (line   6)
-* octal values, enabling interpretation of: Options.          (line 166)
+* octal values, enabling interpretation of: Options.          (line 182)
 * OFMT variable <1>:                     User-modified.       (line 115)
 * OFMT variable <2>:                     Conversion.          (line  55)
 * OFMT variable:                         OFMT.                (line  15)
@@ -26562,7 +26644,7 @@ Index
 * OFS variable <2>:                      Output Separators.   (line   6)
 * OFS variable:                          Changing Fields.     (line  64)
 * OpenBSD:                               Glossary.            (line 611)
-* OpenSolaris:                           Other Versions.      (line  86)
+* OpenSolaris:                           Other Versions.      (line  87)
 * operating systems, BSD-based:          Manual History.      (line  28)
 * operating systems, PC, gawk on:        PC Using.            (line   6)
 * operating systems, PC, gawk on, installing: PC Installation.
@@ -26595,7 +26677,7 @@ Index
                                                               (line  48)
 * operators, word-boundary (gawk):       GNU Regexp Operators.
                                                               (line  63)
-* option debugger command:               Dgawk Info.          (line  56)
+* option debugger command:               Debugger Info.       (line  57)
 * options, command-line <1>:             Command Line Field Separator.
                                                               (line   6)
 * options, command-line <2>:             Options.             (line   6)
@@ -26606,7 +26688,7 @@ Index
 * options, deprecated:                   Obsolete.            (line   6)
 * options, long <1>:                     Options.             (line   6)
 * options, long:                         Command Line.        (line  13)
-* options, printing list of:             Options.             (line 142)
+* options, printing list of:             Options.             (line 151)
 * OR bitwise operation:                  Bitwise Functions.   (line   6)
 * or Boolean-logic operator:             Boolean Ops.         (line   6)
 * or() function (gawk):                  Bitwise Functions.   (line  48)
@@ -26633,14 +26715,14 @@ Index
 * P1003.1 POSIX standard:                Glossary.            (line 454)
 * P1003.2 POSIX standard:                Glossary.            (line 454)
 * parameters, number of:                 Internals.           (line  42)
+* parentheses () <1>:                    Profiling.           (line 138)
 * parentheses ():                        Regexp Operators.    (line  79)
-* parentheses (), pgawk program:         Profiling.           (line 141)
 * password file:                         Passwd Functions.    (line  16)
 * patsplit() function:                   String Functions.    (line 293)
 * patterns:                              Patterns and Actions.
                                                               (line   6)
 * patterns, comparison expressions as:   Expression Patterns. (line  14)
-* patterns, counts:                      Profiling.           (line 113)
+* patterns, counts:                      Profiling.           (line 110)
 * patterns, default:                     Very Simple.         (line  34)
 * patterns, empty:                       Empty.               (line   6)
 * patterns, expressions as:              Regexp Patterns.     (line   6)
@@ -26658,9 +26740,6 @@ Index
 * Perl:                                  Future Extensions.   (line   6)
 * Peters, Arno:                          Contributors.        (line  85)
 * Peterson, Hal:                         Contributors.        (line  40)
-* pgawk program:                         Profiling.           (line   6)
-* pgawk program, awkprof.out file:       Profiling.           (line  10)
-* pgawk program, dynamic profiling:      Profiling.           (line 174)
 * pipes, closing:                        Close Files And Pipes.
                                                               (line   6)
 * pipes, input:                          Getline/Pipe.        (line   6)
@@ -26701,13 +26780,13 @@ Index
 * portability, NF variable, decrementing: Changing Fields.    (line 115)
 * portability, operators:                Increment Ops.       (line  61)
 * portability, operators, not in POSIX awk: Precedence.       (line  98)
-* portability, POSIXLY_CORRECT environment variable: Options. (line 310)
+* portability, POSIXLY_CORRECT environment variable: Options. (line 328)
 * portability, substr() function:        String Functions.    (line 512)
 * portable object files <1>:             Translator i18n.     (line   6)
 * portable object files:                 Explaining gettext.  (line  36)
 * portable object files, converting to message object files: I18N Example.
                                                               (line  62)
-* portable object files, generating:     Options.             (line 135)
+* portable object files, generating:     Options.             (line 144)
 * portable object template files:        Explaining gettext.  (line  30)
 * porting gawk:                          New Ports.           (line   6)
 * positional specifiers, printf statement <1>: Printf Ordering.
@@ -26751,11 +26830,11 @@ Index
 * POSIX awk, regular expressions and:    Regexp Operators.    (line 157)
 * POSIX awk, timestamps and:             Time Functions.      (line   6)
 * POSIX awk, | I/O operator and:         Getline/Pipe.        (line  52)
-* POSIX mode:                            Options.             (line 199)
+* POSIX mode:                            Options.             (line 222)
 * POSIX, awk and:                        Preface.             (line  23)
 * POSIX, gawk extensions not included in: POSIX/GNU.          (line   6)
 * POSIX, programs, implementing in awk:  Clones.              (line   6)
-* POSIXLY_CORRECT environment variable:  Options.             (line 289)
+* POSIXLY_CORRECT environment variable:  Options.             (line 307)
 * precedence <1>:                        Precedence.          (line   6)
 * precedence:                            Increment Ops.       (line  61)
 * precedence, regexp operators:          Regexp Operators.    (line 152)
@@ -26789,7 +26868,7 @@ Index
 * printf statement, sprintf() function and: Round Function.   (line   6)
 * printf statement, syntax of:           Basic Printf.        (line   6)
 * printing:                              Printing.            (line   6)
-* printing, list of options:             Options.             (line 142)
+* printing, list of options:             Options.             (line 151)
 * printing, mailing labels:              Labels Program.      (line   6)
 * printing, unduplicated lines of text:  Uniq Program.        (line   6)
 * printing, user information:            Id Program.          (line   6)
@@ -26805,8 +26884,8 @@ Index
 * PROCINFO array <7>:                    Auto-set.            (line 123)
 * PROCINFO array:                        Obsolete.            (line  11)
 * profiling awk programs:                Profiling.           (line   6)
-* profiling awk programs, dynamically:   Profiling.           (line 174)
-* profiling gawk, See pgawk program:     Profiling.           (line   6)
+* profiling awk programs, dynamically:   Profiling.           (line 171)
+* profiling gawk:                        Profiling.           (line   6)
 * program, definition of:                Getting Started.     (line  21)
 * programmers, attractiveness of:        Two-way I/O.         (line   6)
 * programming conventions, --non-decimal-data option: Nondecimal Data.
@@ -26830,23 +26909,23 @@ Index
 * programming, basic steps:              Basic High Level.    (line  19)
 * programming, concepts:                 Basic Concepts.      (line   6)
 * pwcat program:                         Passwd Functions.    (line  23)
-* q debugger command (alias for quit):   Miscellaneous Dgawk Commands.
+* q debugger command (alias for quit):   Miscellaneous Debugger Commands.
                                                               (line 101)
-* QSE Awk:                               Other Versions.      (line 108)
+* QSE Awk:                               Other Versions.      (line 109)
 * question mark (?) regexp operator <1>: GNU Regexp Operators.
                                                               (line  59)
 * question mark (?) regexp operator:     Regexp Operators.    (line 111)
 * question mark (?), ?: operator:        Precedence.          (line  92)
-* QuikTrim Awk:                          Other Versions.      (line 112)
-* quit debugger command:                 Miscellaneous Dgawk Commands.
+* QuikTrim Awk:                          Other Versions.      (line 113)
+* quit debugger command:                 Miscellaneous Debugger Commands.
                                                               (line 101)
-* QUIT signal (MS-Windows):              Profiling.           (line 207)
+* QUIT signal (MS-Windows):              Profiling.           (line 206)
 * quoting <1>:                           Comments.            (line  27)
 * quoting <2>:                           Long.                (line  26)
 * quoting:                               Read Terminal.       (line  25)
 * quoting, rules for:                    Quoting.             (line   6)
 * quoting, tricks for:                   Quoting.             (line  71)
-* r debugger command (alias for run):    Dgawk Execution Control.
+* r debugger command (alias for run):    Debugger Execution Control.
                                                               (line  62)
 * Rakitzis, Byron:                       History Sorting.     (line  25)
 * rand() function:                       Numeric Functions.   (line  33)
@@ -26912,7 +26991,7 @@ Index
                                                               (line  59)
 * regular expressions, gawk, command-line options: GNU Regexp Operators.
                                                               (line  70)
-* regular expressions, interval expressions and: Options.     (line 224)
+* regular expressions, interval expressions and: Options.     (line 247)
 * regular expressions, leftmost longest match: Leftmost Longest.
                                                               (line   6)
 * regular expressions, operators <1>:    Regexp Operators.    (line   6)
@@ -26928,7 +27007,7 @@ Index
 * regular expressions, searching for:    Egrep Program.       (line   6)
 * relational operators, See comparison operators: Typing and Comparison.
                                                               (line   9)
-* return debugger command:               Dgawk Execution Control.
+* return debugger command:               Debugger Execution Control.
                                                               (line  54)
 * return statement, user-defined functions: Return Statement. (line   6)
 * return values, close() function:       Close Files And Pipes.
@@ -26981,12 +27060,12 @@ Index
 * Rubin, Paul <1>:                       Contributors.        (line  16)
 * Rubin, Paul:                           History.             (line  30)
 * rule, definition of:                   Getting Started.     (line  21)
-* run debugger command:                  Dgawk Execution Control.
+* run debugger command:                  Debugger Execution Control.
                                                               (line  62)
 * rvalues/lvalues:                       Assignment Ops.      (line  32)
-* s debugger command (alias for step):   Dgawk Execution Control.
+* s debugger command (alias for step):   Debugger Execution Control.
                                                               (line  68)
-* sandbox mode:                          Options.             (line 236)
+* sandbox mode:                          Options.             (line 254)
 * scalar values:                         Basic Data Typing.   (line  13)
 * Schorr, Andrew:                        Acknowledgments.     (line  60)
 * Schreiber, Bert:                       Acknowledgments.     (line  38)
@@ -27032,7 +27111,7 @@ Index
                                                               (line   6)
 * shift, bitwise:                        Bitwise Functions.   (line  32)
 * short-circuit operators:               Boolean Ops.         (line  57)
-* si debugger command (alias for stepi): Dgawk Execution Control.
+* si debugger command (alias for stepi): Debugger Execution Control.
                                                               (line  76)
 * side effects <1>:                      Increment Ops.       (line  11)
 * side effects:                          Concatenation.       (line  42)
@@ -27047,15 +27126,15 @@ Index
 * side effects, FILENAME variable:       Getline Notes.       (line  19)
 * side effects, function calls:          Function Calls.      (line  54)
 * side effects, statements:              Action Overview.     (line  32)
-* SIGHUP signal:                         Profiling.           (line 204)
-* SIGINT signal (MS-Windows):            Profiling.           (line 207)
-* signals, HUP/SIGHUP:                   Profiling.           (line 204)
-* signals, INT/SIGINT (MS-Windows):      Profiling.           (line 207)
-* signals, QUIT/SIGQUIT (MS-Windows):    Profiling.           (line 207)
-* signals, USR1/SIGUSR1:                 Profiling.           (line 182)
-* SIGQUIT signal (MS-Windows):           Profiling.           (line 207)
-* SIGUSR1 signal:                        Profiling.           (line 182)
-* silent debugger command:               Dgawk Execution Control.
+* SIGHUP signal:                         Profiling.           (line 203)
+* SIGINT signal (MS-Windows):            Profiling.           (line 206)
+* signals, HUP/SIGHUP:                   Profiling.           (line 203)
+* signals, INT/SIGINT (MS-Windows):      Profiling.           (line 206)
+* signals, QUIT/SIGQUIT (MS-Windows):    Profiling.           (line 206)
+* signals, USR1/SIGUSR1:                 Profiling.           (line 180)
+* SIGQUIT signal (MS-Windows):           Profiling.           (line 206)
+* SIGUSR1 signal:                        Profiling.           (line 180)
+* silent debugger command:               Debugger Execution Control.
                                                               (line  10)
 * sin() function:                        Numeric Functions.   (line  74)
 * single precision floating-point:       Basic Data Typing.   (line  36)
@@ -27068,7 +27147,7 @@ Index
                                                               (line   6)
 * Skywalker, Luke:                       Undocumented.        (line   6)
 * sleep utility:                         Alarm Program.       (line 109)
-* Solaris, POSIX-compliant awk:          Other Versions.      (line  86)
+* Solaris, POSIX-compliant awk:          Other Versions.      (line  87)
 * sort function, arrays, sorting:        Array Sorting Functions.
                                                               (line   6)
 * sort utility:                          Word Sorting.        (line  50)
@@ -27077,17 +27156,17 @@ Index
                                                               (line  93)
 * source code, awka:                     Other Versions.      (line  55)
 * source code, Brian Kernighan's awk:    Other Versions.      (line  13)
-* source code, Busybox Awk:              Other Versions.      (line  78)
+* source code, Busybox Awk:              Other Versions.      (line  79)
 * source code, gawk:                     Gawk Distribution.   (line   6)
-* source code, jawk:                     Other Versions.      (line  96)
-* source code, libmawk:                  Other Versions.      (line 104)
+* source code, jawk:                     Other Versions.      (line  97)
+* source code, libmawk:                  Other Versions.      (line 105)
 * source code, mawk:                     Other Versions.      (line  35)
-* source code, mixing:                   Options.             (line 105)
+* source code, mixing:                   Options.             (line 114)
 * source code, pawk:                     Other Versions.      (line  69)
-* source code, QSE Awk:                  Other Versions.      (line 108)
-* source code, QuikTrim Awk:             Other Versions.      (line 112)
-* source code, Solaris awk:              Other Versions.      (line  86)
-* source code, xgawk:                    Other Versions.      (line 119)
+* source code, QSE Awk:                  Other Versions.      (line 109)
+* source code, QuikTrim Awk:             Other Versions.      (line 113)
+* source code, Solaris awk:              Other Versions.      (line  87)
+* source code, xgawk:                    Other Versions.      (line 120)
 * source files, search path for:         Igawk Program.       (line 368)
 * sparse arrays:                         Array Intro.         (line  71)
 * Spencer, Henry:                        Glossary.            (line  12)
@@ -27115,9 +27194,9 @@ Index
 * statements, compound, control statements and: Statements.   (line  10)
 * statements, control, in actions:       Statements.          (line   6)
 * statements, multiple:                  Statements/Lines.    (line  91)
-* step debugger command:                 Dgawk Execution Control.
+* step debugger command:                 Debugger Execution Control.
                                                               (line  68)
-* stepi debugger command:                Dgawk Execution Control.
+* stepi debugger command:                Debugger Execution Control.
                                                               (line  76)
 * stlen internal variable:               Internals.           (line  46)
 * stptr internal variable:               Internals.           (line  46)
@@ -27171,8 +27250,8 @@ Index
                                                               (line 148)
 * system() function:                     I/O Functions.       (line  63)
 * systime() function (gawk):             Time Functions.      (line  64)
-* t debugger command (alias for tbreak): Breakpoint Control.  (line  89)
-* tbreak debugger command:               Breakpoint Control.  (line  89)
+* t debugger command (alias for tbreak): Breakpoint Control.  (line  90)
+* tbreak debugger command:               Breakpoint Control.  (line  90)
 * Tcl:                                   Library Names.       (line  57)
 * TCP/IP:                                TCP/IP Networking.   (line   6)
 * TCP/IP, support for:                   Special Network.     (line   6)
@@ -27218,10 +27297,10 @@ Index
 * tolower() function:                    String Functions.    (line 523)
 * toupper() function:                    String Functions.    (line 529)
 * tr utility:                            Translate Program.   (line   6)
-* trace debugger command:                Miscellaneous Dgawk Commands.
+* trace debugger command:                Miscellaneous Debugger Commands.
                                                               (line 110)
 * translate.awk program:                 Translate Program.   (line  55)
-* troubleshooting, --non-decimal-data option: Options.        (line 166)
+* troubleshooting, --non-decimal-data option: Options.        (line 182)
 * troubleshooting, == operator:          Comparison Operators.
                                                               (line  37)
 * troubleshooting, awk uses FS not IFS:  Field Separators.    (line  29)
@@ -27262,7 +27341,7 @@ Index
 * truth values:                          Truth Values.        (line   6)
 * type conversion:                       Conversion.          (line  21)
 * type internal variable:                Internals.           (line  59)
-* u debugger command (alias for until):  Dgawk Execution Control.
+* u debugger command (alias for until):  Debugger Execution Control.
                                                               (line  83)
 * undefined functions:                   Pass By Value/Reference.
                                                               (line  71)
@@ -27289,21 +27368,21 @@ Index
 * UNIXROOT variable, on OS/2 systems:    PC Using.            (line  17)
 * unref() internal function:             Internals.           (line  92)
 * unsigned integers:                     Basic Data Typing.   (line  30)
-* until debugger command:                Dgawk Execution Control.
+* until debugger command:                Debugger Execution Control.
                                                               (line  83)
 * unwatch debugger command:              Viewing And Changing Data.
                                                               (line  84)
-* up debugger command:                   Dgawk Stack.         (line  33)
+* up debugger command:                   Execution Stack.     (line  33)
 * update_ERRNO() internal function:      Internals.           (line 130)
 * update_ERRNO_saved() internal function: Internals.          (line 135)
 * user database, reading:                Passwd Functions.    (line   6)
 * user-defined, functions:               User-defined.        (line   6)
-* user-defined, functions, counts:       Profiling.           (line 132)
+* user-defined, functions, counts:       Profiling.           (line 129)
 * user-defined, variables:               Variables.           (line   6)
 * user-modifiable variables:             User-modified.       (line   6)
 * users, information about, printing:    Id Program.          (line   6)
 * users, information about, retrieving:  Passwd Functions.    (line  16)
-* USR1 signal:                           Profiling.           (line 182)
+* USR1 signal:                           Profiling.           (line 180)
 * values, numeric:                       Basic Data Typing.   (line  13)
 * values, string:                        Basic Data Typing.   (line  13)
 * variable typing:                       Typing and Comparison.
@@ -27354,7 +27433,7 @@ Index
 * Wall, Larry <1>:                       Future Extensions.   (line   6)
 * Wall, Larry:                           Array Intro.         (line   6)
 * Wallin, Anders:                        Acknowledgments.     (line  60)
-* warnings, issuing:                     Options.             (line 147)
+* warnings, issuing:                     Options.             (line 163)
 * watch debugger command:                Viewing And Changing Data.
                                                               (line  67)
 * wc utility:                            Wc Program.          (line   6)
@@ -27366,7 +27445,7 @@ Index
 * whitespace, as field separators:       Default Field Splitting.
                                                               (line   6)
 * whitespace, functions, calling:        Calling Built-in.    (line  10)
-* whitespace, newlines as:               Options.             (line 205)
+* whitespace, newlines as:               Options.             (line 228)
 * Williams, Kent:                        Contributors.        (line  35)
 * Woehlke, Matthew:                      Contributors.        (line  79)
 * Woods, John:                           Contributors.        (line  28)
@@ -27382,7 +27461,7 @@ Index
 * words, usage counts, generating:       Word Sorting.        (line   6)
 * wstlen internal variable:              Internals.           (line  54)
 * wstptr internal variable:              Internals.           (line  54)
-* xgawk:                                 Other Versions.      (line 119)
+* xgawk:                                 Other Versions.      (line 120)
 * xgettext utility:                      String Extraction.   (line  13)
 * XML (eXtensible Markup Language):      Internals.           (line 151)
 * XOR bitwise operation:                 Bitwise Functions.   (line   6)
@@ -27394,8 +27473,8 @@ Index
 * zero, negative vs. positive:           Unexpected Results.  (line  28)
 * zerofile.awk program:                  Empty Files.         (line  21)
 * Zoulas, Christos:                      Contributors.        (line  67)
+* {} (braces):                           Profiling.           (line 134)
 * {} (braces), actions and:              Action Overview.     (line  19)
-* {} (braces), pgawk program:            Profiling.           (line 137)
 * {} (braces), statements, grouping:     Statements.          (line  10)
 * | (vertical bar):                      Regexp Operators.    (line  69)
 * | (vertical bar), | operator (I/O) <1>: Precedence.         (line  65)
@@ -27422,416 +27501,417 @@ Index
 
 Tag Table:
 Node: Top1346
-Node: Foreword30270
-Node: Preface34615
-Ref: Preface-Footnote-137668
-Ref: Preface-Footnote-237774
-Node: History38006
-Node: Names40397
-Ref: Names-Footnote-141874
-Node: This Manual41946
-Ref: This Manual-Footnote-146893
-Node: Conventions46993
-Node: Manual History49127
-Ref: Manual History-Footnote-152397
-Ref: Manual History-Footnote-252438
-Node: How To Contribute52512
-Node: Acknowledgments53656
-Node: Getting Started57987
-Node: Running gawk60366
-Node: One-shot61552
-Node: Read Terminal62777
-Ref: Read Terminal-Footnote-164427
-Ref: Read Terminal-Footnote-264703
-Node: Long64874
-Node: Executable Scripts66250
-Ref: Executable Scripts-Footnote-168119
-Ref: Executable Scripts-Footnote-268221
-Node: Comments68672
-Node: Quoting71139
-Node: DOS Quoting75762
-Node: Sample Data Files76437
-Node: Very Simple79469
-Node: Two Rules84068
-Node: More Complex86215
-Ref: More Complex-Footnote-189145
-Node: Statements/Lines89230
-Ref: Statements/Lines-Footnote-193692
-Node: Other Features93957
-Node: When94885
-Node: Invoking Gawk97032
-Node: Command Line98417
-Node: Options99200
-Ref: Options-Footnote-1112637
-Node: Other Arguments112662
-Node: Naming Standard Input115320
-Node: Environment Variables116414
-Node: AWKPATH Variable116858
-Ref: AWKPATH Variable-Footnote-1119455
-Node: Other Environment Variables119715
-Node: Exit Status122055
-Node: Include Files122730
-Node: Obsolete126215
-Node: Undocumented126901
-Node: Regexp127142
-Node: Regexp Usage128531
-Node: Escape Sequences130557
-Node: Regexp Operators136320
-Ref: Regexp Operators-Footnote-1143517
-Ref: Regexp Operators-Footnote-2143664
-Node: Bracket Expressions143762
-Ref: table-char-classes145652
-Node: GNU Regexp Operators148175
-Node: Case-sensitivity151898
-Ref: Case-sensitivity-Footnote-1154866
-Ref: Case-sensitivity-Footnote-2155101
-Node: Leftmost Longest155209
-Node: Computed Regexps156410
-Node: Reading Files159820
-Node: Records161761
-Ref: Records-Footnote-1170435
-Node: Fields170472
-Ref: Fields-Footnote-1173505
-Node: Nonconstant Fields173591
-Node: Changing Fields175793
-Node: Field Separators181774
-Node: Default Field Splitting184403
-Node: Regexp Field Splitting185520
-Node: Single Character Fields188862
-Node: Command Line Field Separator189921
-Node: Field Splitting Summary193362
-Ref: Field Splitting Summary-Footnote-1196554
-Node: Constant Size196655
-Node: Splitting By Content201239
-Ref: Splitting By Content-Footnote-1204965
-Node: Multiple Line205005
-Ref: Multiple Line-Footnote-1210852
-Node: Getline211031
-Node: Plain Getline213259
-Node: Getline/Variable215348
-Node: Getline/File216489
-Node: Getline/Variable/File217811
-Ref: Getline/Variable/File-Footnote-1219410
-Node: Getline/Pipe219497
-Node: Getline/Variable/Pipe222057
-Node: Getline/Coprocess223164
-Node: Getline/Variable/Coprocess224407
-Node: Getline Notes225121
-Node: Getline Summary227063
-Ref: table-getline-variants227406
-Node: Command line directories228262
-Node: Printing228887
-Node: Print230518
-Node: Print Examples231855
-Node: Output Separators234639
-Node: OFMT236399
-Node: Printf237757
-Node: Basic Printf238663
-Node: Control Letters240202
-Node: Format Modifiers244014
-Node: Printf Examples250023
-Node: Redirection252738
-Node: Special Files259722
-Node: Special FD260255
-Ref: Special FD-Footnote-1263880
-Node: Special Network263954
-Node: Special Caveats264804
-Node: Close Files And Pipes265600
-Ref: Close Files And Pipes-Footnote-1272623
-Ref: Close Files And Pipes-Footnote-2272771
-Node: Expressions272921
-Node: Values274053
-Node: Constants274729
-Node: Scalar Constants275409
-Ref: Scalar Constants-Footnote-1276268
-Node: Nondecimal-numbers276450
-Node: Regexp Constants279509
-Node: Using Constant Regexps279984
-Node: Variables283039
-Node: Using Variables283694
-Node: Assignment Options285418
-Node: Conversion287290
-Ref: table-locale-affects292666
-Ref: Conversion-Footnote-1293290
-Node: All Operators293399
-Node: Arithmetic Ops294029
-Node: Concatenation296534
-Ref: Concatenation-Footnote-1299327
-Node: Assignment Ops299447
-Ref: table-assign-ops304435
-Node: Increment Ops305843
-Node: Truth Values and Conditions309313
-Node: Truth Values310396
-Node: Typing and Comparison311445
-Node: Variable Typing312234
-Ref: Variable Typing-Footnote-1316131
-Node: Comparison Operators316253
-Ref: table-relational-ops316663
-Node: POSIX String Comparison320212
-Ref: POSIX String Comparison-Footnote-1321168
-Node: Boolean Ops321306
-Ref: Boolean Ops-Footnote-1325384
-Node: Conditional Exp325475
-Node: Function Calls327207
-Node: Precedence330801
-Node: Locales334470
-Node: Patterns and Actions335559
-Node: Pattern Overview336613
-Node: Regexp Patterns338282
-Node: Expression Patterns338825
-Node: Ranges342510
-Node: BEGIN/END345476
-Node: Using BEGIN/END346238
-Ref: Using BEGIN/END-Footnote-1348969
-Node: I/O And BEGIN/END349075
-Node: BEGINFILE/ENDFILE351357
-Node: Empty354250
-Node: Using Shell Variables354566
-Node: Action Overview356851
-Node: Statements359208
-Node: If Statement361062
-Node: While Statement362561
-Node: Do Statement364605
-Node: For Statement365761
-Node: Switch Statement368913
-Node: Break Statement371010
-Node: Continue Statement373000
-Node: Next Statement374793
-Node: Nextfile Statement377183
-Node: Exit Statement379728
-Node: Built-in Variables382144
-Node: User-modified383239
-Ref: User-modified-Footnote-1391265
-Node: Auto-set391327
-Ref: Auto-set-Footnote-1400618
-Node: ARGC and ARGV400823
-Node: Arrays404674
-Node: Array Basics406179
-Node: Array Intro407005
-Node: Reference to Elements411323
-Node: Assigning Elements413593
-Node: Array Example414084
-Node: Scanning an Array415816
-Node: Controlling Scanning418130
-Ref: Controlling Scanning-Footnote-1423063
-Node: Delete423379
-Ref: Delete-Footnote-1425814
-Node: Numeric Array Subscripts425871
-Node: Uninitialized Subscripts428054
-Node: Multi-dimensional429682
-Node: Multi-scanning432776
-Node: Arrays of Arrays434367
-Node: Functions439012
-Node: Built-in439834
-Node: Calling Built-in440912
-Node: Numeric Functions442900
-Ref: Numeric Functions-Footnote-1446665
-Ref: Numeric Functions-Footnote-2447022
-Ref: Numeric Functions-Footnote-3447070
-Node: String Functions447339
-Ref: String Functions-Footnote-1470836
-Ref: String Functions-Footnote-2470965
-Ref: String Functions-Footnote-3471213
-Node: Gory Details471300
-Ref: table-sub-escapes472979
-Ref: table-sub-posix-92474333
-Ref: table-sub-proposed475676
-Ref: table-posix-sub477026
-Ref: table-gensub-escapes478572
-Ref: Gory Details-Footnote-1479779
-Ref: Gory Details-Footnote-2479830
-Node: I/O Functions479981
-Ref: I/O Functions-Footnote-1486636
-Node: Time Functions486783
-Ref: Time Functions-Footnote-1497675
-Ref: Time Functions-Footnote-2497743
-Ref: Time Functions-Footnote-3497901
-Ref: Time Functions-Footnote-4498012
-Ref: Time Functions-Footnote-5498124
-Ref: Time Functions-Footnote-6498351
-Node: Bitwise Functions498617
-Ref: table-bitwise-ops499175
-Ref: Bitwise Functions-Footnote-1503335
-Node: Type Functions503519
-Node: I18N Functions503989
-Node: User-defined505616
-Node: Definition Syntax506420
-Ref: Definition Syntax-Footnote-1511330
-Node: Function Example511399
-Node: Function Caveats513993
-Node: Calling A Function514414
-Node: Variable Scope515529
-Node: Pass By Value/Reference517504
-Node: Return Statement520944
-Node: Dynamic Typing523925
-Node: Indirect Calls524660
-Node: Internationalization534345
-Node: I18N and L10N535771
-Node: Explaining gettext536457
-Ref: Explaining gettext-Footnote-1541523
-Ref: Explaining gettext-Footnote-2541707
-Node: Programmer i18n541872
-Node: Translator i18n546072
-Node: String Extraction546865
-Ref: String Extraction-Footnote-1547826
-Node: Printf Ordering547912
-Ref: Printf Ordering-Footnote-1550696
-Node: I18N Portability550760
-Ref: I18N Portability-Footnote-1553209
-Node: I18N Example553272
-Ref: I18N Example-Footnote-1555907
-Node: Gawk I18N555979
-Node: Advanced Features556596
-Node: Nondecimal Data558109
-Node: Array Sorting559692
-Node: Controlling Array Traversal560389
-Node: Array Sorting Functions568626
-Ref: Array Sorting Functions-Footnote-1572300
-Ref: Array Sorting Functions-Footnote-2572393
-Node: Two-way I/O572587
-Ref: Two-way I/O-Footnote-1578019
-Node: TCP/IP Networking578089
-Node: Profiling580933
-Node: Library Functions588407
-Ref: Library Functions-Footnote-1591414
-Node: Library Names591585
-Ref: Library Names-Footnote-1595056
-Ref: Library Names-Footnote-2595276
-Node: General Functions595362
-Node: Strtonum Function596315
-Node: Assert Function599245
-Node: Round Function602571
-Node: Cliff Random Function604114
-Node: Ordinal Functions605130
-Ref: Ordinal Functions-Footnote-1608200
-Ref: Ordinal Functions-Footnote-2608452
-Node: Join Function608661
-Ref: Join Function-Footnote-1610432
-Node: Gettimeofday Function610632
-Node: Data File Management614347
-Node: Filetrans Function614979
-Node: Rewind Function619118
-Node: File Checking620505
-Node: Empty Files621599
-Node: Ignoring Assigns623829
-Node: Getopt Function625382
-Ref: Getopt Function-Footnote-1636686
-Node: Passwd Functions636889
-Ref: Passwd Functions-Footnote-1645864
-Node: Group Functions645952
-Node: Walking Arrays654036
-Node: Sample Programs655605
-Node: Running Examples656270
-Node: Clones656998
-Node: Cut Program658222
-Node: Egrep Program668067
-Ref: Egrep Program-Footnote-1675840
-Node: Id Program675950
-Node: Split Program679566
-Ref: Split Program-Footnote-1683085
-Node: Tee Program683213
-Node: Uniq Program686016
-Node: Wc Program693445
-Ref: Wc Program-Footnote-1697711
-Ref: Wc Program-Footnote-2697911
-Node: Miscellaneous Programs698003
-Node: Dupword Program699191
-Node: Alarm Program701222
-Node: Translate Program705971
-Ref: Translate Program-Footnote-1710358
-Ref: Translate Program-Footnote-2710586
-Node: Labels Program710720
-Ref: Labels Program-Footnote-1714091
-Node: Word Sorting714175
-Node: History Sorting718059
-Node: Extract Program719898
-Ref: Extract Program-Footnote-1727381
-Node: Simple Sed727509
-Node: Igawk Program730571
-Ref: Igawk Program-Footnote-1745728
-Ref: Igawk Program-Footnote-2745929
-Node: Anagram Program746067
-Node: Signature Program749135
-Node: Debugger750235
-Node: Debugging751146
-Node: Debugging Concepts751559
-Node: Debugging Terms753415
-Node: Awk Debugging756038
-Node: Sample dgawk session756930
-Node: dgawk invocation757422
-Node: Finding The Bug758604
-Node: List of Debugger Commands765090
-Node: Breakpoint Control766401
-Node: Dgawk Execution Control770037
-Node: Viewing And Changing Data773388
-Node: Dgawk Stack776725
-Node: Dgawk Info778185
-Node: Miscellaneous Dgawk Commands782133
-Node: Readline Support787561
-Node: Dgawk Limitations788399
-Node: Language History790588
-Node: V7/SVR3.1792100
-Node: SVR4794421
-Node: POSIX795863
-Node: BTL796871
-Node: POSIX/GNU797605
-Node: Common Extensions802756
-Node: Ranges and Locales803863
-Ref: Ranges and Locales-Footnote-1808467
-Node: Contributors808688
-Node: Installation812950
-Node: Gawk Distribution813844
-Node: Getting814328
-Node: Extracting815154
-Node: Distribution contents816846
-Node: Unix Installation822068
-Node: Quick Installation822685
-Node: Additional Configuration Options824647
-Node: Configuration Philosophy826124
-Node: Non-Unix Installation828466
-Node: PC Installation828924
-Node: PC Binary Installation830223
-Node: PC Compiling832071
-Node: PC Testing835015
-Node: PC Using836191
-Node: Cygwin840376
-Node: MSYS841376
-Node: VMS Installation841890
-Node: VMS Compilation842493
-Ref: VMS Compilation-Footnote-1843500
-Node: VMS Installation Details843558
-Node: VMS Running845193
-Node: VMS Old Gawk846800
-Node: Bugs847274
-Node: Other Versions851126
-Node: Notes856407
-Node: Compatibility Mode857099
-Node: Additions857882
-Node: Accessing The Source858694
-Node: Adding Code860119
-Node: New Ports866086
-Node: Dynamic Extensions870199
-Node: Internals871575
-Node: Plugin License880094
-Node: Sample Library880728
-Node: Internal File Description881414
-Node: Internal File Ops885129
-Ref: Internal File Ops-Footnote-1889853
-Node: Using Internal File Ops889993
-Node: Future Extensions892370
-Node: Basic Concepts894874
-Node: Basic High Level895631
-Ref: Basic High Level-Footnote-1899666
-Node: Basic Data Typing899851
-Node: Floating Point Issues904376
-Node: String Conversion Precision905459
-Ref: String Conversion Precision-Footnote-1907159
-Node: Unexpected Results907268
-Node: POSIX Floating Point Problems909094
-Ref: POSIX Floating Point Problems-Footnote-1912799
-Node: Glossary912837
-Node: Copying937813
-Node: GNU Free Documentation License975370
-Node: Index1000507
+Node: Foreword30346
+Node: Preface34691
+Ref: Preface-Footnote-137744
+Ref: Preface-Footnote-237850
+Node: History38082
+Node: Names40473
+Ref: Names-Footnote-141950
+Node: This Manual42022
+Ref: This Manual-Footnote-146960
+Node: Conventions47060
+Node: Manual History49194
+Ref: Manual History-Footnote-152464
+Ref: Manual History-Footnote-252505
+Node: How To Contribute52579
+Node: Acknowledgments53723
+Node: Getting Started58054
+Node: Running gawk60433
+Node: One-shot61619
+Node: Read Terminal62844
+Ref: Read Terminal-Footnote-164494
+Ref: Read Terminal-Footnote-264770
+Node: Long64941
+Node: Executable Scripts66317
+Ref: Executable Scripts-Footnote-168186
+Ref: Executable Scripts-Footnote-268288
+Node: Comments68739
+Node: Quoting71206
+Node: DOS Quoting75829
+Node: Sample Data Files76504
+Node: Very Simple79536
+Node: Two Rules84135
+Node: More Complex86282
+Ref: More Complex-Footnote-189212
+Node: Statements/Lines89297
+Ref: Statements/Lines-Footnote-193759
+Node: Other Features94024
+Node: When94952
+Node: Invoking Gawk97099
+Node: Command Line98484
+Node: Options99267
+Ref: Options-Footnote-1113412
+Node: Other Arguments113437
+Node: Naming Standard Input116095
+Node: Environment Variables117189
+Node: AWKPATH Variable117633
+Ref: AWKPATH Variable-Footnote-1120230
+Node: Other Environment Variables120490
+Node: Exit Status122830
+Node: Include Files123505
+Node: Obsolete126990
+Node: Undocumented127676
+Node: Regexp127917
+Node: Regexp Usage129306
+Node: Escape Sequences131332
+Node: Regexp Operators137095
+Ref: Regexp Operators-Footnote-1144292
+Ref: Regexp Operators-Footnote-2144439
+Node: Bracket Expressions144537
+Ref: table-char-classes146427
+Node: GNU Regexp Operators148950
+Node: Case-sensitivity152673
+Ref: Case-sensitivity-Footnote-1155641
+Ref: Case-sensitivity-Footnote-2155876
+Node: Leftmost Longest155984
+Node: Computed Regexps157185
+Node: Reading Files160595
+Node: Records162536
+Ref: Records-Footnote-1171210
+Node: Fields171247
+Ref: Fields-Footnote-1174280
+Node: Nonconstant Fields174366
+Node: Changing Fields176568
+Node: Field Separators182549
+Node: Default Field Splitting185178
+Node: Regexp Field Splitting186295
+Node: Single Character Fields189637
+Node: Command Line Field Separator190696
+Node: Field Splitting Summary194137
+Ref: Field Splitting Summary-Footnote-1197329
+Node: Constant Size197430
+Node: Splitting By Content202014
+Ref: Splitting By Content-Footnote-1205740
+Node: Multiple Line205780
+Ref: Multiple Line-Footnote-1211627
+Node: Getline211806
+Node: Plain Getline214034
+Node: Getline/Variable216123
+Node: Getline/File217264
+Node: Getline/Variable/File218586
+Ref: Getline/Variable/File-Footnote-1220185
+Node: Getline/Pipe220272
+Node: Getline/Variable/Pipe222832
+Node: Getline/Coprocess223939
+Node: Getline/Variable/Coprocess225182
+Node: Getline Notes225896
+Node: Getline Summary227838
+Ref: table-getline-variants228181
+Node: Command line directories229037
+Node: Printing229662
+Node: Print231293
+Node: Print Examples232630
+Node: Output Separators235414
+Node: OFMT237174
+Node: Printf238532
+Node: Basic Printf239438
+Node: Control Letters240977
+Node: Format Modifiers244789
+Node: Printf Examples250798
+Node: Redirection253513
+Node: Special Files260497
+Node: Special FD261030
+Ref: Special FD-Footnote-1264655
+Node: Special Network264729
+Node: Special Caveats265579
+Node: Close Files And Pipes266375
+Ref: Close Files And Pipes-Footnote-1273398
+Ref: Close Files And Pipes-Footnote-2273546
+Node: Expressions273696
+Node: Values274828
+Node: Constants275504
+Node: Scalar Constants276184
+Ref: Scalar Constants-Footnote-1277043
+Node: Nondecimal-numbers277225
+Node: Regexp Constants280284
+Node: Using Constant Regexps280759
+Node: Variables283814
+Node: Using Variables284469
+Node: Assignment Options286193
+Node: Conversion288065
+Ref: table-locale-affects293441
+Ref: Conversion-Footnote-1294065
+Node: All Operators294174
+Node: Arithmetic Ops294804
+Node: Concatenation297309
+Ref: Concatenation-Footnote-1300102
+Node: Assignment Ops300222
+Ref: table-assign-ops305210
+Node: Increment Ops306618
+Node: Truth Values and Conditions310088
+Node: Truth Values311171
+Node: Typing and Comparison312220
+Node: Variable Typing313009
+Ref: Variable Typing-Footnote-1316906
+Node: Comparison Operators317028
+Ref: table-relational-ops317438
+Node: POSIX String Comparison320987
+Ref: POSIX String Comparison-Footnote-1321943
+Node: Boolean Ops322081
+Ref: Boolean Ops-Footnote-1326159
+Node: Conditional Exp326250
+Node: Function Calls327982
+Node: Precedence331576
+Node: Locales335245
+Node: Patterns and Actions336334
+Node: Pattern Overview337388
+Node: Regexp Patterns339057
+Node: Expression Patterns339600
+Node: Ranges343285
+Node: BEGIN/END346251
+Node: Using BEGIN/END347013
+Ref: Using BEGIN/END-Footnote-1349744
+Node: I/O And BEGIN/END349850
+Node: BEGINFILE/ENDFILE352132
+Node: Empty355025
+Node: Using Shell Variables355341
+Node: Action Overview357626
+Node: Statements359983
+Node: If Statement361837
+Node: While Statement363336
+Node: Do Statement365380
+Node: For Statement366536
+Node: Switch Statement369688
+Node: Break Statement371785
+Node: Continue Statement373775
+Node: Next Statement375568
+Node: Nextfile Statement377958
+Node: Exit Statement380503
+Node: Built-in Variables382919
+Node: User-modified384014
+Ref: User-modified-Footnote-1392040
+Node: Auto-set392102
+Ref: Auto-set-Footnote-1401393
+Node: ARGC and ARGV401598
+Node: Arrays405449
+Node: Array Basics406954
+Node: Array Intro407780
+Node: Reference to Elements412098
+Node: Assigning Elements414368
+Node: Array Example414859
+Node: Scanning an Array416591
+Node: Controlling Scanning418905
+Ref: Controlling Scanning-Footnote-1423838
+Node: Delete424154
+Ref: Delete-Footnote-1426589
+Node: Numeric Array Subscripts426646
+Node: Uninitialized Subscripts428829
+Node: Multi-dimensional430457
+Node: Multi-scanning433551
+Node: Arrays of Arrays435142
+Node: Functions439787
+Node: Built-in440609
+Node: Calling Built-in441687
+Node: Numeric Functions443675
+Ref: Numeric Functions-Footnote-1447440
+Ref: Numeric Functions-Footnote-2447797
+Ref: Numeric Functions-Footnote-3447845
+Node: String Functions448114
+Ref: String Functions-Footnote-1471611
+Ref: String Functions-Footnote-2471740
+Ref: String Functions-Footnote-3471988
+Node: Gory Details472075
+Ref: table-sub-escapes473754
+Ref: table-sub-posix-92475108
+Ref: table-sub-proposed476451
+Ref: table-posix-sub477801
+Ref: table-gensub-escapes479347
+Ref: Gory Details-Footnote-1480554
+Ref: Gory Details-Footnote-2480605
+Node: I/O Functions480756
+Ref: I/O Functions-Footnote-1487411
+Node: Time Functions487558
+Ref: Time Functions-Footnote-1498450
+Ref: Time Functions-Footnote-2498518
+Ref: Time Functions-Footnote-3498676
+Ref: Time Functions-Footnote-4498787
+Ref: Time Functions-Footnote-5498899
+Ref: Time Functions-Footnote-6499126
+Node: Bitwise Functions499392
+Ref: table-bitwise-ops499950
+Ref: Bitwise Functions-Footnote-1504110
+Node: Type Functions504294
+Node: I18N Functions504764
+Node: User-defined506391
+Node: Definition Syntax507195
+Ref: Definition Syntax-Footnote-1512105
+Node: Function Example512174
+Node: Function Caveats514768
+Node: Calling A Function515189
+Node: Variable Scope516304
+Node: Pass By Value/Reference518279
+Node: Return Statement521719
+Node: Dynamic Typing524700
+Node: Indirect Calls525435
+Node: Internationalization535120
+Node: I18N and L10N536546
+Node: Explaining gettext537232
+Ref: Explaining gettext-Footnote-1542298
+Ref: Explaining gettext-Footnote-2542482
+Node: Programmer i18n542647
+Node: Translator i18n546847
+Node: String Extraction547640
+Ref: String Extraction-Footnote-1548601
+Node: Printf Ordering548687
+Ref: Printf Ordering-Footnote-1551471
+Node: I18N Portability551535
+Ref: I18N Portability-Footnote-1553984
+Node: I18N Example554047
+Ref: I18N Example-Footnote-1556682
+Node: Gawk I18N556754
+Node: Advanced Features557371
+Node: Nondecimal Data558884
+Node: Array Sorting560467
+Node: Controlling Array Traversal561164
+Node: Array Sorting Functions569401
+Ref: Array Sorting Functions-Footnote-1573075
+Ref: Array Sorting Functions-Footnote-2573168
+Node: Two-way I/O573362
+Ref: Two-way I/O-Footnote-1578794
+Node: TCP/IP Networking578864
+Node: Profiling581708
+Node: Library Functions589162
+Ref: Library Functions-Footnote-1592169
+Node: Library Names592340
+Ref: Library Names-Footnote-1595811
+Ref: Library Names-Footnote-2596031
+Node: General Functions596117
+Node: Strtonum Function597070
+Node: Assert Function600000
+Node: Round Function603326
+Node: Cliff Random Function604869
+Node: Ordinal Functions605885
+Ref: Ordinal Functions-Footnote-1608955
+Ref: Ordinal Functions-Footnote-2609207
+Node: Join Function609416
+Ref: Join Function-Footnote-1611187
+Node: Gettimeofday Function611387
+Node: Data File Management615102
+Node: Filetrans Function615734
+Node: Rewind Function619873
+Node: File Checking621260
+Node: Empty Files622354
+Node: Ignoring Assigns624584
+Node: Getopt Function626137
+Ref: Getopt Function-Footnote-1637441
+Node: Passwd Functions637644
+Ref: Passwd Functions-Footnote-1646619
+Node: Group Functions646707
+Node: Walking Arrays654791
+Node: Sample Programs656360
+Node: Running Examples657025
+Node: Clones657753
+Node: Cut Program658977
+Node: Egrep Program668822
+Ref: Egrep Program-Footnote-1676595
+Node: Id Program676705
+Node: Split Program680321
+Ref: Split Program-Footnote-1683840
+Node: Tee Program683968
+Node: Uniq Program686771
+Node: Wc Program694200
+Ref: Wc Program-Footnote-1698466
+Ref: Wc Program-Footnote-2698666
+Node: Miscellaneous Programs698758
+Node: Dupword Program699946
+Node: Alarm Program701977
+Node: Translate Program706726
+Ref: Translate Program-Footnote-1711113
+Ref: Translate Program-Footnote-2711341
+Node: Labels Program711475
+Ref: Labels Program-Footnote-1714846
+Node: Word Sorting714930
+Node: History Sorting718814
+Node: Extract Program720653
+Ref: Extract Program-Footnote-1728136
+Node: Simple Sed728264
+Node: Igawk Program731326
+Ref: Igawk Program-Footnote-1746483
+Ref: Igawk Program-Footnote-2746684
+Node: Anagram Program746822
+Node: Signature Program749890
+Node: Debugger750990
+Node: Debugging751942
+Node: Debugging Concepts752375
+Node: Debugging Terms754231
+Node: Awk Debugging756828
+Node: Sample Debugging Session757720
+Node: Debugger Invocation758240
+Node: Finding The Bug759569
+Node: List of Debugger Commands766057
+Node: Breakpoint Control767391
+Node: Debugger Execution Control771055
+Node: Viewing And Changing Data774415
+Node: Execution Stack777771
+Node: Debugger Info779238
+Node: Miscellaneous Debugger Commands783219
+Node: Readline Support788664
+Node: Limitations789495
+Node: Language History791747
+Node: V7/SVR3.1793259
+Node: SVR4795580
+Node: POSIX797022
+Node: BTL798030
+Node: POSIX/GNU798764
+Node: Common Extensions803915
+Node: Ranges and Locales805022
+Ref: Ranges and Locales-Footnote-1809626
+Node: Contributors809847
+Node: Installation814108
+Node: Gawk Distribution815002
+Node: Getting815486
+Node: Extracting816312
+Node: Distribution contents818004
+Node: Unix Installation823226
+Node: Quick Installation823843
+Node: Additional Configuration Options825805
+Node: Configuration Philosophy827282
+Node: Non-Unix Installation829624
+Node: PC Installation830082
+Node: PC Binary Installation831381
+Node: PC Compiling833229
+Node: PC Testing836173
+Node: PC Using837349
+Node: Cygwin841534
+Node: MSYS842534
+Node: VMS Installation843048
+Node: VMS Compilation843651
+Ref: VMS Compilation-Footnote-1844658
+Node: VMS Installation Details844716
+Node: VMS Running846351
+Node: VMS Old Gawk847958
+Node: Bugs848432
+Node: Other Versions852284
+Node: Notes857599
+Node: Compatibility Mode858291
+Node: Additions859074
+Node: Accessing The Source859886
+Node: Adding Code861311
+Node: New Ports867278
+Node: Dynamic Extensions871391
+Node: Internals872831
+Node: Plugin License881350
+Node: Loading Extensions881988
+Node: Sample Library883798
+Node: Internal File Description884488
+Node: Internal File Ops888203
+Ref: Internal File Ops-Footnote-1892927
+Node: Using Internal File Ops893067
+Node: Future Extensions895444
+Node: Basic Concepts897948
+Node: Basic High Level898705
+Ref: Basic High Level-Footnote-1902740
+Node: Basic Data Typing902925
+Node: Floating Point Issues907450
+Node: String Conversion Precision908533
+Ref: String Conversion Precision-Footnote-1910233
+Node: Unexpected Results910342
+Node: POSIX Floating Point Problems912168
+Ref: POSIX Floating Point Problems-Footnote-1915873
+Node: Glossary915911
+Node: Copying940887
+Node: GNU Free Documentation License978444
+Node: Index1003581
 
 End Tag Table
diff --git a/doc/gawk.texi b/doc/gawk.texi
index dfd620f..1368185 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -290,7 +290,7 @@ particular records in a file and perform operations upon 
them.
 * Library Functions::              A Library of @command{awk} Functions.
 * Sample Programs::                Many @command{awk} programs with complete
                                    explanations.
-* Debugger::                       The @code{dgawk} debugger.
+* Debugger::                       The @code{gawk} debugger.
 * Language History::               The evolution of the @command{awk}
                                    language.
 * Installation::                   Installing @command{gawk} under various
@@ -614,23 +614,23 @@ particular records in a file and perform operations upon 
them.
 * Anagram Program::                Finding anagrams from a dictionary.
 * Signature Program::              People do amazing things with too much time
                                    on their hands.
-* Debugging::                      Introduction to @command{dgawk}.
-* Debugging Concepts::             Debugging In General.
+* Debugging::                      Introduction to @command{gawk} Debugger.
+* Debugging Concepts::             Debugging in General.
 * Debugging Terms::                Additional Debugging Concepts.
 * Awk Debugging::                  Awk Debugging.
-* Sample dgawk session::           Sample @command{dgawk} session.
-* dgawk invocation::               @command{dgawk} Invocation.
-* Finding The Bug::                Finding The Bug.
-* List of Debugger Commands::      Main @command{dgawk} Commands.
-* Breakpoint Control::             Control of breakpoints.
-* Dgawk Execution Control::        Control of execution.
-* Viewing And Changing Data::      Viewing and changing data.
-* Dgawk Stack::                    Dealing with the stack.
-* Dgawk Info::                     Obtaining information about the program and
-                                   the debugger state.
-* Miscellaneous Dgawk Commands::   Miscellaneous Commands.
+* Sample Debugging Session::       Sample Debugging Session.
+* Debugger Invocation::            How to Start the Debugger.
+* Finding The Bug::                Finding the Bug.
+* List of Debugger Commands::      Main Commands.
+* Breakpoint Control::             Control of Breakpoints.
+* Debugger Execution Control::     Control of Execution.
+* Viewing And Changing Data::      Viewing and Changing Data.
+* Execution Stack::                Dealing with the Stack.
+* Debugger Info::                  Obtaining Information about the Program and
+                                   the Debugger State.
+* Miscellaneous Debugger Commands:: Miscellaneous Commands.
 * Readline Support::               Readline Support.
-* Dgawk Limitations::              Limitations and future plans.
+* Limitations::                    Limitations and Future Plans.
 * V7/SVR3.1::                      The major changes between V7 and System V
                                    Release 3.1.
 * SVR4::                           Minor changes between System V Releases 3.1
@@ -686,6 +686,7 @@ particular records in a file and perform operations upon 
them.
 * Internals::                      A brief look at some @command{gawk}
                                    internals.
 * Plugin License::                 A note about licensing.
+* Loading Extensions::             How to load dynamic extensions.
 * Sample Library::                 A example of new functions.
 * Internal File Description::      What the new functions will do.
 * Internal File Ops::              The code for internal file operations.
@@ -1164,8 +1165,7 @@ provide many sample @command{awk} programs.
 Reading them allows you to see @command{awk}
 solving real problems.
 
address@hidden, describes the @command{awk} debugger,
address@hidden
address@hidden, describes the @command{awk} debugger.
 
 @ref{Language History},
 describes how the @command{awk} language has evolved since
@@ -3101,6 +3101,19 @@ inadvertently use global variables that you meant to be 
local.
 (This is a particularly easy mistake to make with simple variable
 names like @code{i}, @code{j}, etc.)
 
address@hidden address@hidden@address@hidden
address@hidden address@hidden@address@hidden
address@hidden @code{-D} option
address@hidden @code{--debug} option
address@hidden @command{awk} debugging, enabling
+Enable debugging of @command{awk} programs
+(@pxref{Debugging}).
+By default, the debugger reads commands interactively from the terminal.
+The optional @var{file} argument allows you to specify a file with a list
+of commands for the debugger to execute non-interactively.
+No space is allowed between the @option{-D} and @var{file}, if
address@hidden is supplied.
+
 @item -e @var{program-text}
 @itemx --source @var{program-text}
 @cindex @code{-e} option
@@ -3166,6 +3179,15 @@ for information about this option.
 Print a ``usage'' message summarizing the short and long style options
 that @command{gawk} accepts and then exit.
 
address@hidden -l @var{lib}
address@hidden --load @var{lib}
address@hidden @code{-l} option
address@hidden @code{--load} option
address@hidden loading, library
+Load a shared library @var{lib}. This searches for the library using the 
@env{AWKPATH}
+environment variable. The suffix @samp{.so} in the library name is optional.
+The library initialization routine should be named @code{dlload()}.
+
 @item -L @address@hidden
 @itemx address@hidden@r{]}
 @cindex @code{-l} option
@@ -3212,6 +3234,18 @@ Use with care.
 Force the use of the locale's decimal point character
 when parsing numeric input data (@pxref{Locales}).
 
address@hidden address@hidden@address@hidden
address@hidden address@hidden@address@hidden
address@hidden @code{-o} option
address@hidden @code{--pretty-print} option
address@hidden @command{awk} enabling
+Enable pretty-printing of @command{awk} programs.
+By default, output program is created in a file named @file{awkprof.out}.
+The optional @var{file} argument allows you to specify a different
address@hidden for the output.
+No space is allowed between the @option{-o} and @var{file}, if
address@hidden is supplied.
+
 @item -O
 @itemx --optimize
 @cindex @code{--optimize} option
@@ -3224,7 +3258,7 @@ maintainer hopes to add more optimizations over time.
 @itemx address@hidden@address@hidden
 @cindex @code{-p} option
 @cindex @code{--profile} option
address@hidden @command{awk} programs, profiling, enabling
address@hidden @command{awk} profiling, enabling
 Enable profiling of @command{awk} programs
 (@pxref{Profiling}).
 By default, profiles are created in a file named @file{awkprof.out}.
@@ -3233,10 +3267,8 @@ The optional @var{file} argument allows you to specify a 
different
 No space is allowed between the @option{-p} and @var{file}, if
 @var{file} is supplied.
 
-When run with @command{gawk}, the profile is just a ``pretty printed'' version
-of the program.  When run with @command{pgawk}, the profile contains execution
-counts for each statement in the program in the left margin, and function
-call counts for each function.
+The profile contains execution counts for each statement in the program
+in the left margin, and function call counts for each function.
 
 @item -P
 @itemx --posix
@@ -3300,14 +3332,6 @@ This is now @command{gawk}'s default behavior.
 Nevertheless, this option remains both for backward compatibility,
 and for use in combination with the @option{--traditional} option.
 
address@hidden -R @var{file}
address@hidden address@hidden
address@hidden @code{-R} option
address@hidden @code{--command} option
address@hidden only.
-Read @command{dgawk} debugger options and commands from @var{file}.
address@hidden Info}, for more information.
-
 @item -S
 @itemx --sandbox
 @cindex @code{-S} option
@@ -3704,7 +3728,7 @@ into smaller, more manageable pieces, and also lets you 
reuse common @command{aw
 code from various @command{awk} scripts.  In other words, you can group
 together @command{awk} functions, used to carry out specific tasks,
 into external files. These files can be used just like function libraries,
-using the @samp{@@include} keyword in conjunction with the @code{AWKPATH}
+using the @samp{@@include} keyword in conjunction with the @env{AWKPATH}
 environment variable.
 
 Let's see an example.
@@ -18954,40 +18978,32 @@ extensive examples.
 @cindex @command{awk} programs, profiling
 @c STARTOFRANGE proawk
 @cindex profiling @command{awk} programs
address@hidden STARTOFRANGE pgawk
address@hidden @command{pgawk} program
address@hidden profiling @command{gawk}, See @command{pgawk} program
-
-You may produce execution
-traces of your @command{awk} programs.
-This is done with a specially compiled version of @command{gawk},
-called @command{pgawk} (``profiling @command{gawk}'').
-
address@hidden profiling @command{gawk}
 @cindex @code{awkprof.out} file
 @cindex files, @code{awkprof.out}
address@hidden @command{pgawk} program, @code{awkprof.out} file
address@hidden is identical in every way to @command{gawk}, except that when
-it has finished running, it creates a profile of your program in a file
-named @file{awkprof.out}.
-Because it is profiling, it also executes up to 45% slower than
+
+You may produce execution traces of your @command{awk} programs.
+This is done by passing the option @option{--profile} to @command{gawk}.
+When @command{gawk} has finished running, it creates a profile of your program 
in a file
+named @file{awkprof.out}. Because it is profiling, it also executes up to 45% 
slower than
 @command{gawk} normally does.
 
 @cindex @code{--profile} option
 As shown in the following example,
 the @option{--profile} option can be used to change the name of the file
-where @command{pgawk} will write the profile:
+where @command{gawk} will write the profile:
 
 @example
-pgawk --profile=myprog.prof -f myprog.awk data1 data2
+gawk --profile=myprog.prof -f myprog.awk data1 data2
 @end example
 
 @noindent
-In the above example, @command{pgawk} places the profile in
+In the above example, @command{gawk} places the profile in
 @file{myprog.prof} instead of in @file{awkprof.out}.
 
-Here is a sample
-session showing a simple @command{awk} program, its input data, and the
-results from running @command{pgawk}.  First, the @command{awk} program:
+Here is a sample session showing a simple @command{awk} program, its input 
data, and the
+results from running @command{gawk} with the @option{--profile} option.
+First, the @command{awk} program:
 
 @example
 BEGIN @{ print "First BEGIN rule" @}
@@ -19027,12 +19043,12 @@ foo
 junk
 @end example
 
-Here is the @file{awkprof.out} that results from running @command{pgawk}
-on this program and data (this example also illustrates that @command{awk}
+Here is the @file{awkprof.out} that results from running the @command{gawk}
+profiler on this program and data (this example also illustrates that 
@command{awk}
 programmers sometimes have to work late):
 
address@hidden @code{BEGIN} pattern, @command{pgawk} program
address@hidden @code{END} pattern, @command{pgawk} program
address@hidden @code{BEGIN} pattern
address@hidden @code{END} pattern
 @example
         # gawk profile, created Sun Aug 13 00:00:15 2000
 
@@ -19124,15 +19140,15 @@ keyword indicates how many times the function was 
called.
 The counts next to the statements in the body show how many times
 those statements were executed.
 
address@hidden @address@hidden@}} (braces), @command{pgawk} program
address@hidden braces (@address@hidden@}}), @command{pgawk} program
address@hidden @address@hidden@}} (braces)
address@hidden braces (@address@hidden@}})
 @item
 The layout uses ``K&R'' style with TABs.
 Braces are used everywhere, even when
 the body of an @code{if}, @code{else}, or loop is only a single statement.
 
address@hidden @code{()} (parentheses), @command{pgawk} program
address@hidden parentheses @code{()}, @command{pgawk} program
address@hidden @code{()} (parentheses)
address@hidden parentheses @code{()}
 @item
 Parentheses are used only where needed, as indicated by the structure
 of the program and the precedence rules.
@@ -19155,16 +19171,16 @@ Similarly, if
 the target of a redirection isn't a scalar, it gets parenthesized.
 
 @item
address@hidden supplies leading comments in
address@hidden supplies leading comments in
 front of the @code{BEGIN} and @code{END} rules,
 the pattern/action rules, and the functions.
 
 @end itemize
 
 The profiled version of your program may not look exactly like what you
-typed when you wrote it.  This is because @command{pgawk} creates the
+typed when you wrote it.  This is because @command{gawk} creates the
 profiled version by ``pretty printing'' its internal representation of
-the program.  The advantage to this is that @command{pgawk} can produce
+the program.  The advantage to this is that @command{gawk} can produce
 a standard representation.  The disadvantage is that all source-code
 comments are lost, as are the distinctions among multiple @code{BEGIN},
 @code{END}, @code{BEGINFILE}, and @code{ENDFILE} rules.  Also, things such as:
@@ -19186,15 +19202,16 @@ come out as:
 which is correct, but possibly surprising.
 
 @cindex profiling @command{awk} programs, dynamically
address@hidden @command{pgawk} program, dynamic profiling
address@hidden @command{gawk} program, dynamic profiling
 Besides creating profiles when a program has completed,
address@hidden can produce a profile while it is running.
address@hidden can produce a profile while it is running.
 This is useful if your @command{awk} program goes into an
 infinite loop and you want to see what has been executed.
-To use this feature, run @command{pgawk} in the background:
+To use this feature, run @command{gawk} with the @option{--profile}
+option in the background:
 
 @example
-$ @kbd{pgawk -f myprog &}
+$ @kbd{gawk --profile -f myprog &}
 [1] 13992
 @end example
 
@@ -19205,7 +19222,7 @@ $ @kbd{pgawk -f myprog &}
 @noindent
 The shell prints a job number and process ID number; in this case, 13992.
 Use the @command{kill} command to send the @code{USR1} signal
-to @command{pgawk}:
+to @command{gawk}:
 
 @example
 $ @kbd{kill -USR1 13992}
@@ -19213,8 +19230,8 @@ $ @kbd{kill -USR1 13992}
 
 @noindent
 As usual, the profiled version of the program is written to
address@hidden, or to a different file if you use the @option{--profile}
-option.
address@hidden, or to a different file if one specified with
+the @option{--profile} option.
 
 Along with the regular profile, as shown earlier, the profile
 includes a trace of any active functions:
@@ -19228,7 +19245,7 @@ includes a trace of any active functions:
 # -- main --
 @end example
 
-You may send @command{pgawk} the @code{USR1} signal as many times as you like.
+You may send @command{gawk} the @code{USR1} signal as many times as you like.
 Each time, the profile and function call trace are appended to the output
 profile file.
 
@@ -19236,7 +19253,7 @@ profile file.
 @cindex @code{SIGHUP} signal
 @cindex signals, @code{HUP}/@code{SIGHUP}
 If you use the @code{HUP} signal instead of the @code{USR1} signal,
address@hidden produces the profile and the function call trace and then exits.
address@hidden produces the profile and the function call trace and then exits.
 
 @cindex @code{INT} signal (MS-Windows)
 @cindex @code{SIGINT} signal (MS-Windows)
@@ -19244,21 +19261,20 @@ If you use the @code{HUP} signal instead of the 
@code{USR1} signal,
 @cindex @code{QUIT} signal (MS-Windows)
 @cindex @code{SIGQUIT} signal (MS-Windows)
 @cindex signals, @code{QUIT}/@code{SIGQUIT} (MS-Windows)
-When @command{pgawk} runs on MS-Windows systems, it uses the
+When @command{gawk} runs on MS-Windows systems, it uses the
 @code{INT} and @code{QUIT} signals for producing the profile and, in
-the case of the @code{INT} signal, @command{pgawk} exits.  This is
+the case of the @code{INT} signal, @command{gawk} exits.  This is
 because these systems don't support the @command{kill} command, so the
 only signals you can deliver to a program are those generated by the
 keyboard.  The @code{INT} signal is generated by the
 @address@hidden@key{C}} or @address@hidden@key{BREAK}} key, while the
 @code{QUIT} signal is generated by the @address@hidden@key{\}} key.
 
-Finally, regular @command{gawk} also accepts the @option{--profile} option.
+Finally, @command{gawk} also accepts another option @option{--pretty-print}.
 When called this way, @command{gawk} ``pretty prints'' the program into
 @file{awkprof.out}, without any execution counts.
 @c ENDOFRANGE advgaw
 @c ENDOFRANGE gawadv
address@hidden ENDOFRANGE pgawk
 @c ENDOFRANGE awkp
 @c ENDOFRANGE proawk
 
@@ -25140,41 +25156,41 @@ BEGIN {
 @c FIXME: Add more indexing.
 
 @node Debugger
address@hidden @command{dgawk}: The @command{awk} Debugger
address@hidden @command{dgawk}
address@hidden Debugging @command{awk} Programs
address@hidden debugging @command{awk} programs
 
 It would be nice if computer programs worked perfectly the first time they
 were run, but in real life, this rarely happens for programs of
 any complexity.  Thus, most programming languages have facilities available
 for ``debugging'' programs, and now @command{awk} is no exception.
 
-The @command{dgawk} debugger is purposely modeled after
+The @command{gawk} debugger is purposely modeled after
 @uref{http://www.gnu.org/software/gdb/, the GNU Debugger (GDB)}
 command-line debugger.  If you are familiar with GDB, learning
address@hidden is easy.
+how to use @command{gawk} for debugging your program is easy.
 
 @menu
-* Debugging::                   Introduction to @command{dgawk}.
-* Sample dgawk session::        Sample @command{dgawk} session.
-* List of Debugger Commands::   Main @command{dgawk} Commands.
-* Readline Support::            Readline Support.
-* Dgawk Limitations::           Limitations and future plans.
+* Debugging::                   Introduction to @command{gawk} debugger.
+* Sample Debugging Session::    Sample debugging session.
+* List of Debugger Commands::   Main debugger commands.
+* Readline Support::            Readline support.
+* Limitations::                 Limitations and future plans.
 @end menu
 
 @node Debugging
address@hidden Introduction to @command{dgawk}
address@hidden Introduction to @command{gawk} Debugger
 
 This @value{SECTION} introduces debugging in general and begins
 the discussion of debugging in @command{gawk}.
 
 @menu
-* Debugging Concepts::          Debugging In General.
+* Debugging Concepts::          Debugging in General.
 * Debugging Terms::             Additional Debugging Concepts.
 * Awk Debugging::               Awk Debugging.
 @end menu
 
 @node Debugging Concepts
address@hidden Debugging In General
address@hidden Debugging in General
 
 (If you have used debuggers in other languages, you may want to skip
 ahead to the next section on the specific features of the @command{awk}
@@ -25220,8 +25236,7 @@ functional program that you or someone else wrote).
 @subsection Additional Debugging Concepts
 
 Before diving in to the details, we need to introduce several
-important concepts that apply to just about all debuggers, including
address@hidden
+important concepts that apply to just about all debuggers.
 The following list defines terms used throughout the rest of
 this @value{CHAPTER}.
 
@@ -25240,7 +25255,7 @@ that contains the function's parameters, local 
variables, and return value,
 as well as any other ``bookkeeping'' information needed to manage the
 call stack.  This data area is termed a @dfn{stack frame}.
 
address@hidden also follows this model, and @command{dgawk} gives you
address@hidden also follows this model, and gives you
 access to the call stack and to each stack frame. You can see the
 call stack, as well as from where each function on the stack was
 invoked. Commands that print the call stack print information about
@@ -25285,48 +25300,48 @@ each line of @command{awk} code.  The debugger 
provides the opportunity
 to look at the individual primitive instructions carried out
 by the higher-level @command{awk} commands.
 
address@hidden Sample dgawk session
address@hidden Sample @command{dgawk} session
address@hidden Sample Debugging Session
address@hidden Sample Debugging Session
 
-In order to illustrate the use of @command{dgawk}, let's look at a sample
+In order to illustrate the use of @command{gawk} as a debugger, let's look at 
a sample
 debugging session.  We will use the @command{awk} implementation of the
 POSIX @command{uniq} command described earlier (@pxref{Uniq Program})
 as our example.
 
 @menu
-* dgawk invocation::            @command{dgawk} Invocation.
-* Finding The Bug::             Finding The Bug.
+* Debugger Invocation::         How to Start the Debugger.
+* Finding The Bug::             Finding the Bug.
 @end menu
 
address@hidden dgawk invocation
address@hidden @command{dgawk} Invocation
address@hidden Debugger Invocation
address@hidden How to Start the Debugger
 
-Starting @command{dgawk} is exactly like running @command{awk}.  The
-file(s) containing the program and any supporting code are given on the
-command line as arguments to one or more @option{-f} options.
-(@command{dgawk} is not designed to debug command-line
-programs, only programs contained in files.)  In our case,
-we call @command{dgawk} like this:
+Starting the debugger is almost exactly like running @command{awk}, except you 
have to
+pass an additional option @option{--debug} or the corresponding short option 
@option{-D}.
+The file(s) containing the program and any supporting code are given on the 
command
+line as arguments to one or more @option{-f} options. (@command{gawk} is not 
designed
+to debug command-line programs, only programs contained in files.)  In our 
case,
+we invoke the debugger like this:
 
 @example
-$ @kbd{dgawk -f getopt.awk -f join.awk -f uniq.awk inputfile}
+$ @kbd{gawk -D -f getopt.awk -f join.awk -f uniq.awk inputfile}
 @end example
 
 @noindent
 where both @file{getopt.awk} and @file{uniq.awk} are in @env{$AWKPATH}.
 (Experienced users of GDB or similar debuggers should note that
 this syntax is slightly different from what they are used to.
-With @command{dgawk}, the arguments for running the program are given
+With @command{gawk} debugger, the arguments for running the program are given
 in the command line to the debugger rather than as part of the @code{run}
 command at the debugger prompt.)
 
 Instead of immediately running the program on @file{inputfile}, as
address@hidden would ordinarily do, @command{dgawk} merely loads all
address@hidden would ordinarily do, the debugger merely loads all
 the program source files, compiles them internally, and then gives
 us a prompt:
 
 @example
-dgawk>
+gawk>
 @end example
 
 @noindent
@@ -25334,7 +25349,7 @@ from which we can issue commands to the debugger.  At 
this point, no
 code has been executed.
 
 @node Finding The Bug
address@hidden Finding The Bug
address@hidden Finding the Bug
 
 Let's say that we are having a problem using (a faulty version of)
 @file{uniq.awk} in the ``field-skipping'' mode, and it doesn't seem to be
@@ -25370,7 +25385,7 @@ a breakpoint in @file{uniq.awk} is at the beginning of 
the function
 the breakpoint, use the @code{b} (breakpoint) command:
 
 @example
-dgawk> @kbd{b are_equal}
+gawk> @kbd{b are_equal}
 @print{} Breakpoint 1 set at file `awklib/eg/prog/uniq.awk', line 64
 @end example
 
@@ -25379,22 +25394,22 @@ Now type @samp{r} or @samp{run} and the program runs 
until it hits
 the breakpoint for the first time:
 
 @example
-dgawk> @kbd{r}
+gawk> @kbd{r}
 @print{} Starting program:
 @print{} Stopping in Rule ...
 @print{} Breakpoint 1, are_equal(n, m, clast, cline, alast, aline)
          at `awklib/eg/prog/uniq.awk':64
 @print{} 64          if (fcount == 0 && charcount == 0)
-dgawk>
+gawk>
 @end example
 
 Now we can look at what's going on inside our program.  First of all,
 let's see how we got to where we are.  At the prompt, we type @samp{bt}
-(short for ``backtrace''), and @command{dgawk} responds with a
+(short for ``backtrace''), and the debugger responds with a
 listing of the current stack frames:
 
 @example
-dgawk> @kbd{bt}
+gawk> @kbd{bt}
 @print{} #0  are_equal(n, m, clast, cline, alast, aline)
          at `awklib/eg/prog/uniq.awk':69
 @print{} #1  in main() at `awklib/eg/prog/uniq.awk':89
@@ -25409,11 +25424,11 @@ the key to finding the source of the problem.)
 Now that we're in @code{are_equal()}, we can start looking at the values
 of some variables.  Let's say we type @samp{p n}
 (@code{p} is short for ``print'').  We would expect to see the value of
address@hidden, a parameter to @code{are_equal()}.  Actually, @command{dgawk}
address@hidden, a parameter to @code{are_equal()}.  Actually, the debugger
 gives us:
 
 @example
-dgawk> @kbd{p n}
+gawk> @kbd{p n}
 @print{} n = untyped variable
 @end example
 
@@ -25424,7 +25439,7 @@ function was called without arguments (@pxref{Function 
Calls}).
 A more useful variable to display might be the current record:
 
 @example
-dgawk> @kbd{p $0}
+gawk> @kbd{p $0}
 @print{} $0 = string ("gawk is a wonderful program!")
 @end example
 
@@ -25433,7 +25448,7 @@ This might be a bit puzzling at first since this is the 
second line of
 our test input above.  Let's look at @code{NR}:
 
 @example
-dgawk> @kbd{p NR}
+gawk> @kbd{p NR}
 @print{} NR = number (2)
 @end example
 
@@ -25452,7 +25467,7 @@ NR == 1 @{
 OK, let's just check that that rule worked correctly:
 
 @example
-dgawk> @kbd{p last}
+gawk> @kbd{p last}
 @print{} last = string ("awk is a wonderful program!")
 @end example
 
@@ -25463,7 +25478,7 @@ be inside this function.  To investigate further, we 
must begin
 @samp{n} (for ``next''):
 
 @example
-dgawk> @kbd{n}
+gawk> @kbd{n}
 @print{} 67          if (fcount > 0) @{
 @end example
 
@@ -25483,9 +25498,9 @@ Continuing to step, we now get to the splitting of the 
current and
 last records:
 
 @example
-dgawk> @kbd{n}
+gawk> @kbd{n}
 @print{} 68              n = split(last, alast)
-dgawk> @kbd{n}
+gawk> @kbd{n}
 @print{} 69              m = split($0, aline)
 @end example
 
@@ -25493,7 +25508,7 @@ At this point, we should be curious to see what our 
records were split
 into, so we try to look:
 
 @example
-dgawk> @kbd{p n m alast aline}
+gawk> @kbd{p n m alast aline}
 @print{} n = number (5)
 @print{} m = number (5)
 @print{} alast = array, 5 elements
@@ -25512,7 +25527,7 @@ inside the array?
 The first choice would be to use subscripts:
 
 @example
-dgawk> @kbd{p alast[0]}
+gawk> @kbd{p alast[0]}
 @print{} "0" not in array `alast'
 @end example
 
@@ -25520,16 +25535,16 @@ dgawk> @kbd{p alast[0]}
 Oops!
 
 @example
-dgawk> @kbd{p alast[1]}
+gawk> @kbd{p alast[1]}
 @print{} alast["1"] = string ("awk")
 @end example
 
 This would be kind of slow for a 100-member array, though, so
address@hidden provides a shortcut (reminiscent of another language
address@hidden provides a shortcut (reminiscent of another language
 not to be mentioned):
 
 @example
-dgawk> @kbd{p @@alast}
+gawk> @kbd{p @@alast}
 @print{} alast["1"] = string ("awk")
 @print{} alast["2"] = string ("is")
 @print{} alast["3"] = string ("a")
@@ -25541,9 +25556,9 @@ It looks like we got this far OK.  Let's take another 
step
 or two:
 
 @example
-dgawk> @kbd{n}
+gawk> @kbd{n}
 @print{} 70              clast = join(alast, fcount, n)
-dgawk> @kbd{n}
+gawk> @kbd{n}
 @print{} 71              cline = join(aline, fcount, m)
 @end example
 
@@ -25553,7 +25568,7 @@ the virtual record to compare, and if the first field 
was numbered zero,
 this would work.  Let's look at what we've got:
 
 @example
-dgawk> @kbd{p cline clast}
+gawk> @kbd{p cline clast}
 @print{} cline = string ("gawk is a wonderful program!")
 @print{} clast = string ("awk is a wonderful program!")
 @end example
@@ -25562,10 +25577,10 @@ Hey, those look pretty familiar!  They're just our 
original, unaltered,
 input records.  A little thinking (the human brain is still the best
 debugging tool), and we realize that we were off by one!
 
-We get out of @command{dgawk}:
+We get out of the debugger:
 
 @example
-dgawk> @kbd{q}
+gawk> @kbd{q}
 @print{} The program is running. Exit anyway (y/n)? @kbd{y}
 @end example
 
@@ -25581,9 +25596,9 @@ cline = join(aline, fcount+1, m)
 and problem solved!
 
 @node List of Debugger Commands
address@hidden Main @command{dgawk} Commands
address@hidden Main Debugger Commands
 
-The @command{dgawk} command set can be divided into the
+The @command{gawk} debugger command set can be divided into the
 following categories:
 
 @itemize @bullet{}
@@ -25610,24 +25625,24 @@ Miscellaneous
 Each of these are discussed in the following subsections.
 In the following descriptions, commands which may be abbreviated
 show the abbreviation on a second description line.
-A @command{dgawk} command name may also be truncated if that partial
-name is unambiguous. @command{dgawk} has the built-in capability to
+A debugger command name may also be truncated if that partial
+name is unambiguous. The debugger has the built-in capability to
 automatically repeat the previous command when just hitting @key{Enter}.
 This works for the commands @code{list}, @code{next}, @code{nexti}, 
@code{step}, @code{stepi}
 and @code{continue} executed without any argument.
 
 @menu
-* Breakpoint Control::          Control of breakpoints.
-* Dgawk Execution Control::     Control of execution.
-* Viewing And Changing Data::   Viewing and changing data.
-* Dgawk Stack::                 Dealing with the stack.
-* Dgawk Info::                  Obtaining information about the program and
-                                the debugger state.
-* Miscellaneous Dgawk Commands:: Miscellaneous Commands.
+* Breakpoint Control::          Control of Breakpoints.
+* Debugger Execution Control::  Control of Execution.
+* Viewing And Changing Data::   Viewing and Changing Data.
+* Execution Stack::             Dealing with the Stack.
+* Debugger Info::               Obtaining Information about the Program and
+                                the Debugger State.
+* Miscellaneous Debugger Commands:: Miscellaneous Commands.
 @end menu
 
 @node Breakpoint Control
address@hidden Control Of Breakpoints
address@hidden Control of Breakpoints
 
 As we saw above, the first thing you probably want to do in a debugging
 session is to get your breakpoints set up, since otherwise your program
@@ -25662,10 +25677,10 @@ Each breakpoint is assigned a number which can be 
used to delete it from
 the breakpoint list using the @code{delete} command.
 
 With a breakpoint, you may also supply a condition.  This is an
address@hidden expression (enclosed in double quotes) that @command{dgawk}
address@hidden expression (enclosed in double quotes) that the debugger
 evaluates whenever the breakpoint is reached. If the condition is true,
-then @command{dgawk} stops execution and prompts for a command. Otherwise,
address@hidden continues executing the program.
+then the debugger stops execution and prompts for a command. Otherwise,
+it continues executing the program.
 
 @cindex debugger commands, @code{clear}
 @cindex @code{clear} debugger command
@@ -25691,10 +25706,10 @@ Delete breakpoint(s) set at entry to function 
@var{function}.
 @cindex @code{condition} debugger command
 @item @code{condition} @var{n} @code{"@var{expression}"}
 Add a condition to existing breakpoint or watchpoint @var{n}. The
-condition is an @command{awk} expression that @command{dgawk} evaluates
+condition is an @command{awk} expression that the debugger evaluates
 whenever the breakpoint or watchpoint is reached. If the condition is true, 
then
address@hidden stops execution and prompts for a command. Otherwise,
address@hidden continues executing the program. If the condition expression is
+the debugger stops execution and prompts for a command. Otherwise,
+the debugger continues executing the program. If the condition expression is
 not specified, any existing condition is removed; i.e., the breakpoint or
 watchpoint is made unconditional. 
 
@@ -25750,7 +25765,7 @@ Set a temporary breakpoint (enabled for only one stop).
 The arguments are the same as for @code{break}.
 @end table
 
address@hidden Dgawk Execution Control
address@hidden Debugger Execution Control
 @subsection Control of Execution
 
 Now that your breakpoints are ready, you can start running the program
@@ -25779,14 +25794,14 @@ in the list that resumes execution (e.g., 
@code{continue}) terminates the list
 For example:
 
 @example
-dgawk> @kbd{commands}
+gawk> @kbd{commands}
 > @kbd{silent}
 > @kbd{printf "A silent breakpoint; i = %d\n", i}
 > @kbd{info locals}
 > @kbd{set i = 10}
 > @kbd{continue}
 > @kbd{end}
-dgawk>
+gawk>
 @end example
 
 @cindex debugger commands, @code{c} (@code{continue})
@@ -25836,7 +25851,7 @@ and the caller of that frame becomes the innermost 
frame.
 @cindex @code{r} debugger command (alias for @code{run})
 @item @code{run}
 @itemx @code{r}
-Start/restart execution of the program. When restarting, @command{dgawk}
+Start/restart execution of the program. When restarting, the debugger
 retains the current breakpoints, watchpoints, command history,
 automatic display variables, and debugger options.
 
@@ -25859,7 +25874,7 @@ stopping, unless it encounters a breakpoint or 
watchpoint.
 @itemx @code{si} address@hidden
 Execute one (or @var{count}) instruction(s), stepping inside function calls.
 (For illustration of what is meant by an ``instruction'' in @command{gawk},
-see the output shown under @code{dump} in @ref{Miscellaneous Dgawk Commands}.)
+see the output shown under @code{dump} in @ref{Miscellaneous Debugger 
Commands}.)
 
 @cindex debugger commands, @code{u} (@code{until})
 @cindex debugger commands, @code{until}
@@ -25887,7 +25902,7 @@ The value of the variable or field is displayed each 
time the program stops.
 Each variable added to the list is identified by a unique number:
 
 @example
-dgawk> @kbd{display x}
+gawk> @kbd{display x}
 @print{} 10: x = 1
 @end example
 
@@ -25924,7 +25939,7 @@ Print the value of a @command{gawk} variable or field.
 Fields must be referenced by constants:
 
 @example
-dgawk> @kbd{print $3}
+gawk> @kbd{print $3}
 @end example
 
 @noindent
@@ -25966,16 +25981,16 @@ You can also set special @command{awk} variables, 
such as @code{FS},
 @item @code{watch} @var{var} | @address@hidden 
address@hidden"@var{expression}"}]
 @itemx @code{w} @var{var} | @address@hidden address@hidden"@var{expression}"}]
 Add variable @var{var} (or field @address@hidden) to the watch list.
address@hidden then stops whenever
+The debugger then stops whenever
 the value of the variable or field changes. Each watched item is assigned a
 number which can be used to delete it from the watch list using the
 @code{unwatch} command.
 
 With a watchpoint, you may also supply a condition.  This is an
address@hidden expression (enclosed in double quotes) that @command{dgawk}
address@hidden expression (enclosed in double quotes) that the debugger
 evaluates whenever the watchpoint is reached. If the condition is true,
-then @command{dgawk} stops execution and prompts for a command. Otherwise,
address@hidden continues executing the program.
+then the debugger stops execution and prompts for a command. Otherwise,
address@hidden continues executing the program.
 
 @cindex debugger commands, @code{undisplay}
 @cindex @code{undisplay} debugger command
@@ -25991,8 +26006,8 @@ watch list.
 
 @end table
 
address@hidden Dgawk Stack
address@hidden Dealing With The Stack
address@hidden Execution Stack
address@hidden Dealing with the Stack
 
 Whenever you run a program which contains any function calls,
 @command{gawk} maintains a stack of all of the function calls leading up
@@ -26036,12 +26051,12 @@ Move @var{count} (default 1) frames up the stack 
toward the outermost frame.
 Then select and print the frame.
 @end table
 
address@hidden Dgawk Info
address@hidden Obtaining Information About The Program and The Debugger State
address@hidden Debugger Info
address@hidden Obtaining Information about the Program and the Debugger State
 
 Besides looking at the values of variables, there is often a need to get
 other sorts of information about the state of your program and of the
-debugging environment itself.  @command{dgawk} has one command which
+debugging environment itself.  The @command{gawk} debugger has one command 
which
 provides this information, appropriately called @code{info}.  @code{info}
 is used with one of a number of arguments that tell it exactly what
 you want to know:
@@ -26079,7 +26094,7 @@ Local variables of the selected frame.
 @item source
 The name of the current source file. Each time the program stops, the
 current source file is the file containing the current instruction.
-When @command{dgawk} first starts, the current source file is the first file
+When the debugger first starts, the current source file is the first file
 included via the @option{-f} option. The
 @samp{list @var{filename}:@var{lineno}} command can
 be used at any time to change the current source.
@@ -26115,7 +26130,7 @@ The available options are:
 @c nested table
 @table @code
 @item history_size
-The maximum number of lines to keep in the history file 
@file{./.dgawk_history}.
+The maximum number of lines to keep in the history file @file{./.gawk_history}.
 The default is 100.
 
 @item listsize
@@ -26127,14 +26142,14 @@ to standard output. An empty string (@code{""}) 
resets output to
 standard output.
 
 @item prompt
-The debugger prompt. The default is @address@hidden> }}.
+The debugger prompt. The default is @address@hidden> }}.
 
 @item save_history @r{[}on @r{|} address@hidden
-Save command history to file @file{./.dgawk_history}.
+Save command history to file @file{./.gawk_history}.
 The default is @code{on}.
 
 @item save_options @r{[}on @r{|} address@hidden
-Save current options to file @file{./.dgawkrc} upon exit.
+Save current options to file @file{./.gawkrc} upon exit.
 The default is @code{on}.
 Options are read back in to the next session upon startup.
 
@@ -26154,16 +26169,16 @@ Empty lines are ignored; they do @emph{not}
 repeat the last command.
 You can't restart the program by having more than one @code{run}
 command in the file. Also, the list of commands may include additional
address@hidden commands; however, @command{dgawk} will not source the
address@hidden commands; however, the @command{gawk} debugger will not source 
the
 same file more than once in order to avoid infinite recursion.
 
 In addition to, or instead of the @code{source} command, you can use
-the @option{-R @var{file}} or @address@hidden command-line
+the @option{-D @var{file}} or @address@hidden command-line
 options to execute commands from a file non-interactively
 (@pxref{Options}.
 @end table
 
address@hidden Miscellaneous Dgawk Commands
address@hidden Miscellaneous Debugger Commands
 @subsection Miscellaneous Commands
 
 There are a few more commands which do not fit into the
@@ -26181,7 +26196,7 @@ partial dump of Davide Brini's obfuscated code
 (@pxref{Signature Program}) demonstrates:
 
 @smallexample
-dgawk> @kbd{dump}
+gawk> @kbd{dump}
 @print{}        # BEGIN
 @print{}
 @print{} [     2:0x89faef4] Op_rule             : [in_rule = BEGIN] 
[source_file = brini.awk]
@@ -26230,7 +26245,7 @@ dgawk> @kbd{dump}
 @print{} [      :0x89fa3b0] Op_after_beginfile  : 
 @print{} [      :0x89fa388] Op_no_op            : 
 @print{} [      :0x89fa3c4] Op_after_endfile    : 
-dgawk>
+gawk>
 @end smallexample
 
 @cindex debugger commands, @code{h} (@code{help})
@@ -26239,7 +26254,7 @@ dgawk>
 @cindex @code{h} debugger command (alias for @code{help})
 @item @code{help}
 @itemx @code{h}
-Print a list of all of the @command{dgawk} commands with a short
+Print a list of all of the @command{gawk} debugger commands with a short
 summary of their usage.  @samp{help @var{command}} prints the information
 about the command @var{command}.
 
@@ -26286,7 +26301,7 @@ function @var{function}. This command may change the 
current source file.
 Exit the debugger.  Debugging is great fun, but sometimes we all have
 to tend to other obligations in life, and sometimes we find the bug,
 and are free to go on to the next one!  As we saw above, if you are
-running a program, @command{dgawk} warns you if you accidentally type
+running a program, the debugger warns you if you accidentally type
 @samp{q} or @samp{quit}, to make sure you really want to quit.
 
 @cindex debugger commands, @code{trace}
@@ -26305,7 +26320,7 @@ fairly self-explanatory, and using @code{stepi} and 
@code{nexti} while
 @node Readline Support
 @section Readline Support
 
-If @command{dgawk} is compiled with the @code{readline} library, you
+If @command{gawk} is compiled with the @code{readline} library, you
 can take advantage of that library's command completion and history expansion
 features. The following types of completion are available:
 
@@ -26337,28 +26352,28 @@ and
 
 @end table
 
address@hidden Dgawk Limitations
address@hidden Limitations
 @section Limitations and Future Plans
 
-We hope you find @command{dgawk} useful and enjoyable to work with,
+We hope you find the @command{gawk} debugger useful and enjoyable to work with,
 but as with any program, especially in its early releases, it still has
 some limitations.  A few which are worth being aware of are:
 
 @itemize @bullet{}
 @item
-At this point, @command{dgawk} does not give a detailed explanation of
+At this point, the debugger does not give a detailed explanation of
 what you did wrong when you type in something it doesn't like. Rather, it just
 responds @samp{syntax error}.  When you do figure out what your mistake was,
 though, you'll feel like a real guru.
 
 @item
-If you perused the dump of opcodes in @ref{Miscellaneous Dgawk Commands},
+If you perused the dump of opcodes in @ref{Miscellaneous Debugger Commands},
 (or if you are already familiar with @command{gawk} internals),
 you will realize that much of the internal manipulation of data
 in @command{gawk}, as in many interpreters, is done on a stack.
 @code{Op_push}, @code{Op_pop}, etc., are the ``bread and butter'' of
-most @command{gawk} code.  Unfortunately, as of now, @command{dgawk}
-does not allow you to examine the stack's contents.
+most @command{gawk} code.  Unfortunately, as of now, the @command{gawk}
+debugger does not allow you to examine the stack's contents.
 
 That is, the intermediate results of expression evaluation are on the
 stack, but cannot be printed.  Rather, only variables which are defined
@@ -26373,14 +26388,14 @@ programmer, you are expected to know what 
@code{/[^[:alnum:][:blank:]]/}
 means.
 
 @item
address@hidden is designed to be used by running a program (with all its
-parameters) on the command line, as described in @ref{dgawk invocation}.
+The @command{gawk} debugger is designed to be used by running a program (with 
all its
+parameters) on the command line, as described in @ref{Debugger Invocation}.
 There is no way (as of now) to attach or ``break in'' to a running program.
 This seems reasonable for a language which is used mainly for quickly
 executing, short programs.
 
 @item
address@hidden only accepts source supplied with the @option{-f} option.
+The @command{gawk} debugger only accepts source supplied with the @option{-f} 
option.
 @end itemize
 
 Look forward to a future release when these and other missing features may
@@ -27289,7 +27304,7 @@ environments.
 @cindex Haque, John
 John Haque
 reworked the @command{gawk} internals to use a byte-code engine,
-providing the @command{dgawk} debugger for @command{awk} programs.
+providing the @command{gawk} debugger for @command{awk} programs.
 
 @item
 @cindex Yawitz, Efraim
@@ -28559,7 +28574,7 @@ since approximately 2003.
 @item @command{pawk}
 Nelson H.F.@: Beebe at the University of Utah has modified
 Brian Kernighan's @command{awk} to provide timing and profiling information.
-It is different from @command{pgawk}
+It is different from @command{gawk} with the @option{--profile} option.
 (@pxref{Profiling}),
 in that it uses CPU-based profiling, not line-count
 profiling.  You may find it at either
@@ -29064,6 +29079,7 @@ When @option{--sandbox} is specified, extensions are 
disabled
 @menu
 * Internals::                   A brief look at some @command{gawk} internals.
 * Plugin License::              A note about licensing.
+* Loading Extensions::          How to load dynamic extensions.                
     
 * Sample Library::              A example of new functions.
 @end menu
 
@@ -29374,6 +29390,56 @@ the symbol exists in the global scope.  Something like 
this is enough:
 int plugin_is_GPL_compatible;
 @end example
 
address@hidden Loading Extensions
address@hidden Loading a Dynamic Extension      
address@hidden loading extension
address@hidden @command{gawk}, functions, loading
+There are two ways to load a dynamically linked library. The first is to use 
the
+builtin @code{extension()}:
+
address@hidden
+extension(libname, init_func)
address@hidden example
+
+where @file{libname} is the library to load, and @samp{init_func} is the
+name of the initialization or bootstrap routine to run once loaded.
+
+The second method for dynamic loading of a library is to use the
+command line option @option{-l}:
+
address@hidden
+$ @kbd{gawk -l libname -f myprog}
address@hidden example
+
+This will work only if the initialization routine is named @code{dlload()}.
+
+If you use @code{extension()}, the library will be loaded
+at run time. This means that the functions are available only to the rest of
+your script. If you use the command line option @option{-l} instead,
+the library will be loaded before @command{gawk} starts compiling the
+actual program. The net effect is that you can use those functions
+anywhere in the program.
+
address@hidden has a list of directories where it searches for libraries.
+By default, the list includes directories that depend upon how gawk was built
+and installed (@pxref{AWKPATH Variable}). If you want @command{gawk}
+to look for libraries in your private directory, you have to tell it.
+The way to do it is to set the @env{AWKPATH} environment variable
+(@pxref{AWKPATH Variable}).
address@hidden supplies the default suffix @samp{.so} if it is not
+present in the name of the library.
+If the name of your library is @file{mylib.so}, you can simply type
+
address@hidden
+$ @kbd{gawk -l mylib -f myprog}
address@hidden example
+
+and @command{gawk} will do everything necessary to load in your library,
+and then call your @code{dlload()} routine.
+
+You can always specify the library using an absolute pathname, in which
+case @command{gawk} will not use @env{AWKPATH} to search for it.
+
 @node Sample Library
 @appendixsubsec Example: Directory and File Operation Built-ins
 @c STARTOFRANGE chdirg
diff --git a/eval.c b/eval.c
index 2a29eb9..78598b2 100644
--- a/eval.c
+++ b/eval.c
@@ -29,34 +29,17 @@ extern void after_beginfile(IOBUF **curfile);
 extern double pow(double x, double y);
 extern double modf(double x, double *yp);
 extern double fmod(double x, double y);
-NODE **fcall_list;
+NODE **fcall_list = NULL;
 long fcall_count = 0;
 int currule = 0;
 IOBUF *curfile = NULL;         /* current data file */
 int exiting = FALSE;
 
-#ifdef DEBUGGING
+int (*interpret)(INSTRUCTION *);
+
 extern int pre_execute(INSTRUCTION **);
 extern void post_execute(INSTRUCTION *);
-#else
-#define r_interpret interpret
-#endif
-
-/*
- * Flag which executable this is; done here because eval.c is compiled
- * differently for each of them.
- */
-enum exe_mode which_gawk =
-#ifdef PROFILING
-                          exe_profiling        /* pgawk */
-#else
-# ifdef DEBUGGING
-                          exe_debugging        /* dgawk */     
-# else
-                          exe_normal           /* normal gawk */   
-# endif
-#endif
-                          ;    /* which_gawk */
+extern void frame_popped();
 
 #if __GNUC__ < 2
 NODE *_t;              /* used as a temporary in macros */
@@ -66,12 +49,7 @@ int ORSlen;
 int OFMTidx;
 int CONVFMTidx;
 
-/* Profiling stuff */
-#ifdef PROFILING
-#define INCREMENT(n)   n++
-#else
-#define INCREMENT(n)   /* nothing */
-#endif
+static NODE *node_Boolean[2];
 
 /* This rather ugly macro is for VMS C */
 #ifdef C
@@ -649,8 +627,8 @@ cmp_nodes(NODE *t1, NODE *t2)
        return ret;
 }
 
+/* push_frame --- push a frame NODE onto stack */
 
-#if defined(PROFILING) || defined(DEBUGGING)
 static void
 push_frame(NODE *f)
 {
@@ -672,27 +650,20 @@ push_frame(NODE *f)
        fcall_list[1] = f;
 }
 
+
+/* pop_frame --- pop off a frame NODE*/
+
 static void
 pop_frame()
 {
-#ifdef DEBUGGING
-       extern void frame_popped();
-#endif
        if (fcall_count > 1)
                memmove(fcall_list + 1, fcall_list + 2, (fcall_count - 1) * 
sizeof(NODE *)); 
        fcall_count--;
        assert(fcall_count >= 0);
-#ifdef DEBUGGING
-       frame_popped();
-#endif
+       if (do_debug)
+               frame_popped();
 }
-#else  /* not PROFILING or DEBUGGING */
-#define push_frame(p)  /* nothing */
-#define pop_frame()    /* nothing */
-#endif
-
 
-#ifdef PROFILING
 
 /* dump_fcall_stack --- print a backtrace of the awk function calls */
 
@@ -722,7 +693,6 @@ dump_fcall_stack(FILE *fp)
        fprintf(fp, "\t# %3ld. -- main --\n", k);
 }
 
-#endif /* PROFILING */
 
 /* set_IGNORECASE --- update IGNORECASE as appropriate */
 
@@ -1098,26 +1068,6 @@ NODE **args_array = NULL;
 STACK_ITEM *
 grow_stack()
 {
-       if (stack_ptr == NULL) {
-               long newval;
-
-               if ((newval = getenv_long("GAWK_STACKSIZE")) > 0)
-                       STACK_SIZE = newval;
-
-               emalloc(stack_bottom, STACK_ITEM *, STACK_SIZE * 
sizeof(STACK_ITEM), "grow_stack");
-               stack_ptr = stack_bottom - 1;
-               stack_top = stack_bottom + STACK_SIZE - 1;
-
-               /* initialize frame pointer */
-               getnode(frame_ptr);
-               frame_ptr->type = Node_frame;
-               frame_ptr->stack = NULL;
-               frame_ptr->func_node = NULL;    /* in main */
-               frame_ptr->num_tail_calls = 0;
-               frame_ptr->vname = NULL;
-               return stack_ptr;
-       }
-
        STACK_SIZE *= 2;
        erealloc(stack_bottom, STACK_ITEM *, STACK_SIZE * sizeof(STACK_ITEM), 
"grow_stack");
        stack_top = stack_bottom + STACK_SIZE - 1;
@@ -1260,10 +1210,9 @@ setup_frame(INSTRUCTION *pc)
        fp = f->fparms;
        arg_count = (pc + 1)->expr_count;
 
-#ifndef DEBUGGING
        /* tail recursion optimization */
-       tail_optimize =  (do_optimize > 1 && (pc + 1)->tail_call);
-#endif
+       tail_optimize =  ((pc + 1)->tail_call && do_optimize > 1
+                               && ! do_debug && ! do_profile);
 
        if (tail_optimize) {
                /* free local vars of calling frame */
@@ -1367,7 +1316,8 @@ setup_frame(INSTRUCTION *pc)
 
        frame_ptr->vname = source;      /* save current source */
 
-       push_frame(frame_ptr);
+       if (do_profile || do_debug)
+               push_frame(frame_ptr);
 
        /* save current frame in stack */
        PUSH(frame_ptr);
@@ -1416,7 +1366,8 @@ restore_frame(NODE *fp)
                                   * resumes from ri->nexti.
                                   */
        freenode(frame_ptr);
-       pop_frame();
+       if (do_profile || do_debug)
+               pop_frame();
 
        /* restore frame */
        frame_ptr = fp;
@@ -1519,6 +1470,12 @@ unwind_stack(long n)
 static inline int
 eval_condition(NODE *t)
 {
+       if (t == node_Boolean[FALSE])
+               return FALSE;
+
+       if (t == node_Boolean[TRUE])
+               return TRUE;
+
        if ((t->flags & MAYBE_NUM) != 0)
                force_number(t);
 
@@ -1706,1185 +1663,47 @@ pop_exec_state(int *rule, char **src, long *sz)
        return cp;
 }
 
-
-/*
- * r_interpret:
- *   code is a list of instructions to run. returns the exit value
- *      from the awk code.
- */
- 
- /* N.B.:
- *   1) reference counting done for both number and string values.
- *   2) Stack operations:
- *       Use REPLACE[_XX] if last stack operation was TOP[_XX],
- *       PUSH[_XX] if last operation was POP[_XX] instead. 
- *   3) UPREF and DREF -- see awk.h 
- */
-
-
-int
-r_interpret(INSTRUCTION *code)
+void
+init_interpret()
 {
-       INSTRUCTION *pc;   /* current instruction */
-       NODE *r = NULL;
-       NODE *m;
-       INSTRUCTION *ni;
-       NODE *t1, *t2;
-       NODE *f;        /* function definition */
-       NODE **lhs;
-       AWKNUM x, x1, x2;
-       int di;
-       Regexp *rp;
-       int stdio_problem = FALSE;
-
-
-       if (args_array == NULL)
-               emalloc(args_array, NODE **, (max_args + 2)*sizeof(NODE *), 
"r_interpret");
-       else
-               erealloc(args_array, NODE **, (max_args + 2)*sizeof(NODE *), 
"r_interpret");
-
-/* array subscript */
-#define mk_sub(n)      (n == 1 ? POP_SCALAR() : concat_exp(n, TRUE))
-
-#ifdef DEBUGGING
-#define JUMPTO(x)      do { post_execute(pc); pc = (x); goto top; } 
while(FALSE)
-#else
-#define JUMPTO(x)      do { pc = (x); goto top; } while(FALSE)
-#endif
-
-       pc = code;
-
-       /* N.B.: always use JUMPTO for next instruction, otherwise bad things
-        * may happen. DO NOT add a real loop (for/while) below to
-        * replace ' forever {'; this catches failure to use JUMPTO to execute
-        * next instruction (e.g. continue statement).
-        */
-
-       /* loop until hit Op_stop instruction */
-
-       /* forever {  */
-top:
-               if (pc->source_line > 0)
-                       sourceline = pc->source_line;
-
-#ifdef DEBUGGING
-               if (! pre_execute(&pc))
-                       goto top;
-#endif
-
-               switch (pc->opcode) {
-               case Op_rule:
-                       currule = pc->in_rule;   /* for sole use in Op_K_next, 
Op_K_nextfile, Op_K_getline* */
-                       /* fall through */
-               case Op_func:
-                       source = pc->source_file;
-                       break;
-
-               case Op_atexit:
-                       /* avoid false source indications */
-                       source = NULL;
-                       sourceline = 0;
-                       (void) nextfile(& curfile, TRUE);       /* close input 
data file */ 
-                       /*
-                        * This used to be:
-                        *
-                        * if (close_io() != 0 && ! exiting && exit_val == 0)
-                        *      exit_val = 1;
-                        *
-                        * Other awks don't care about problems closing open 
files
-                        * and pipes, in that it doesn't affect their exit 
status.
-                        * So we no longer do either.
-                        */
-                       (void) close_io(& stdio_problem);
-                       /*
-                        * However, we do want to exit non-zero if there was a 
problem
-                        * with stdout/stderr, so we reinstate a slightly 
different
-                        * version of the above:
-                        */
-                       if (stdio_problem && ! exiting && exit_val == 0)
-                               exit_val = 1;
-                       break;
-
-               case Op_stop:
-                       return 0;
-
-               case Op_push_i:
-                       m = pc->memory;
-                       if (! do_traditional && (m->flags & INTLSTR) != 0) {
-                               char *orig, *trans, save;
-
-                               save = m->stptr[m->stlen];
-                               m->stptr[m->stlen] = '\0';
-                               orig = m->stptr;
-                               trans = dgettext(TEXTDOMAIN, orig);
-                               m->stptr[m->stlen] = save;
-                               m = make_string(trans, strlen(trans));
-                       } else
-                               UPREF(m);
-                       PUSH(m);
-                       break;
-
-               case Op_push:
-               case Op_push_arg:
-               {
-                       NODE *save_symbol;
-                       int isparam = FALSE;
-
-                       save_symbol = m = pc->memory;
-                       if (m->type == Node_param_list) {
-                               isparam = TRUE;
-                               save_symbol = m = GET_PARAM(m->param_cnt);
-                               if (m->type == Node_array_ref)
-                                       m = m->orig_array;
-                       }
-                               
-                       switch (m->type) {
-                       case Node_var:
-                               if (do_lint && var_uninitialized(m))
-                                       lintwarn(isparam ?
-                                               _("reference to uninitialized 
argument `%s'") :
-                                               _("reference to uninitialized 
variable `%s'"),
-                                                               
save_symbol->vname);
-                               m = m->var_value;
-                               UPREF(m);
-                               PUSH(m);
-                               break;
-
-                       case Node_var_new:
-                               m->type = Node_var;
-                               m->var_value = dupnode(Nnull_string);
-                               if (do_lint)
-                                       lintwarn(isparam ?
-                                               _("reference to uninitialized 
argument `%s'") :
-                                               _("reference to uninitialized 
variable `%s'"),
-                                                               
save_symbol->vname);
-                               m = dupnode(Nnull_string);
-                               PUSH(m);
-                               break;
-
-                       case Node_var_array:
-                               if (pc->opcode == Op_push_arg)
-                                       PUSH(m);
-                               else
-                                       fatal(_("attempt to use array `%s' in a 
scalar context"),
-                                                       
array_vname(save_symbol));
-                               break;
-
-                       default:
-                               cant_happen();
-                       }
-               }
-                       break;  
-
-               case Op_push_param:             /* function argument */
-                       m = pc->memory;
-                       if (m->type == Node_param_list)
-                               m = GET_PARAM(m->param_cnt);
-                       if (m->type == Node_var) {
-                               m = m->var_value;
-                               UPREF(m);
-                               PUSH(m);
-                               break;
-                       }
-                       /* else
-                               fall through */
-               case Op_push_array:
-                       PUSH(pc->memory);
-                       break;
-
-               case Op_push_lhs:
-                       lhs = get_lhs(pc->memory, pc->do_reference);
-                       PUSH_ADDRESS(lhs);
-                       break;
-
-               case Op_subscript:
-                       t2 = mk_sub(pc->sub_count);
-                       t1 = POP_ARRAY();
-
-                       if (do_lint && in_array(t1, t2) == NULL) {
-                               t2 = force_string(t2);
-                               lintwarn(_("reference to uninitialized element 
`%s[\"%.*s\"]'"),
-                                       array_vname(t1), (int) t2->stlen, 
t2->stptr);
-                               if (t2->stlen == 0)
-                                       lintwarn(_("subscript of array `%s' is 
null string"), array_vname(t1));
-                       }
-
-                       r = *assoc_lookup(t1, t2);
-                       DEREF(t2);
-                       if (r->type == Node_val)
-                               UPREF(r);
-                       PUSH(r);
-                       break;
-
-               case Op_sub_array:
-                       t2 = mk_sub(pc->sub_count);
-                       t1 = POP_ARRAY();
-                       r = in_array(t1, t2);
-                       if (r == NULL) {
-                               r = make_array();
-                               r->parent_array = t1;
-                               *assoc_lookup(t1, t2) = r;
-                               t2 = force_string(t2);
-                               r->vname = estrdup(t2->stptr, t2->stlen);       
/* the subscript in parent array */
-                       } else if (r->type != Node_var_array) {
-                               t2 = force_string(t2);
-                               fatal(_("attempt to use scalar `%s[\"%.*s\"]' 
as an array"),
-                                               array_vname(t1), (int) 
t2->stlen, t2->stptr);
-                       }
-
-                       DEREF(t2);
-                       PUSH(r);
-                       break;
-
-               case Op_subscript_lhs:
-                       t2 = mk_sub(pc->sub_count);
-                       t1 = POP_ARRAY();
-                       if (do_lint && in_array(t1, t2) == NULL) {
-                               t2 = force_string(t2);
-                               if (pc->do_reference) 
-                                       lintwarn(_("reference to uninitialized 
element `%s[\"%.*s\"]'"),
-                                               array_vname(t1), (int) 
t2->stlen, t2->stptr);
-                               if (t2->stlen == 0)
-                                       lintwarn(_("subscript of array `%s' is 
null string"), array_vname(t1));
-                       }
+       long newval;
 
-                       lhs = assoc_lookup(t1, t2);
-                       if ((*lhs)->type == Node_var_array) {
-                               t2 = force_string(t2);
-                               fatal(_("attempt to use array `%s[\"%.*s\"]' in 
a scalar context"),
-                                               array_vname(t1), (int) 
t2->stlen, t2->stptr);
-                       }
-
-                       DEREF(t2);
-                       PUSH_ADDRESS(lhs);
-                       break;
-
-               case Op_field_spec:
-                       t1 = TOP_SCALAR();
-                       lhs = r_get_field(t1, (Func_ptr *) 0, TRUE);
-                       decr_sp();
-                       DEREF(t1);
-                       r = dupnode(*lhs);     /* can't use UPREF here */
-                       PUSH(r);
-                       break;
-
-               case Op_field_spec_lhs:
-                       t1 = TOP_SCALAR();
-                       lhs = r_get_field(t1, &pc->target_assign->field_assign, 
pc->do_reference);
-                       decr_sp();
-                       DEREF(t1);
-                       PUSH_ADDRESS(lhs);
-                       break;
-
-               case Op_lint:
-                       if (do_lint) {
-                               switch (pc->lint_type) {
-                               case LINT_assign_in_cond:
-                                       lintwarn(_("assignment used in 
conditional context"));
-                                       break;
-
-                               case LINT_no_effect:
-                                       lintwarn(_("statement has no effect"));
-                                       break;
-
-                               default:
-                                       cant_happen();
-                               }
-                       }
-                       break;
-
-               case Op_K_break:
-               case Op_K_continue:
-               case Op_jmp:
-                       JUMPTO(pc->target_jmp);
-
-               case Op_jmp_false:
-                       r = POP_SCALAR();
-                       di = eval_condition(r);
-                       DEREF(r);
-                       if (! di)
-                               JUMPTO(pc->target_jmp);
-                       break;
-
-               case Op_jmp_true:
-                       r = POP_SCALAR();
-                       di = eval_condition(r);
-                       DEREF(r);                       
-                       if (di)
-                               JUMPTO(pc->target_jmp);
-                       break;
-
-               case Op_and:
-               case Op_or:
-                       t1 = POP_SCALAR();
-                       di = eval_condition(t1);
-                       DEREF(t1);
-                       if ((pc->opcode == Op_and && di)
-                                       || (pc->opcode == Op_or && ! di))
-                               break;
-                       r = make_number((AWKNUM) di);
-                       PUSH(r);
-                       ni = pc->target_jmp;
-                       JUMPTO(ni->nexti);
-
-               case Op_and_final:
-               case Op_or_final:
-                       t1 = TOP_SCALAR();
-                       r = make_number((AWKNUM) eval_condition(t1));
-                       DEREF(t1);
-                       REPLACE(r);
-                       break;
-
-               case Op_not:
-                       t1 = TOP_SCALAR();
-                       r = make_number((AWKNUM) ! eval_condition(t1));
-                       DEREF(t1);
-                       REPLACE(r);
-                       break;
-
-               case Op_equal:
-                       r = make_number((AWKNUM) (cmp_scalar() == 0));
-                       REPLACE(r);
-                       break;
-
-               case Op_notequal:
-                       r = make_number((AWKNUM) (cmp_scalar() != 0));
-                       REPLACE(r);
-                       break;
-
-               case Op_less:
-                       r = make_number((AWKNUM) (cmp_scalar() < 0));
-                       REPLACE(r);
-                       break;
-
-               case Op_greater:
-                       r = make_number((AWKNUM) (cmp_scalar() > 0));
-                       REPLACE(r);
-                       break;
-
-               case Op_leq:
-                       r = make_number((AWKNUM) (cmp_scalar() <= 0));
-                       REPLACE(r);
-                       break;
-
-               case Op_geq:
-                       r = make_number((AWKNUM) (cmp_scalar() >= 0));
-                       REPLACE(r);
-                       break;
-
-               case Op_plus_i:
-                       x2 = force_number(pc->memory);
-                       goto plus;
-
-               case Op_plus:
-                       POP_NUMBER(x2);
-plus:
-                       TOP_NUMBER(x1);
-                       r = make_number(x1 + x2);
-                       REPLACE(r);
-                       break;
-
-               case Op_minus_i:
-                       x2 = force_number(pc->memory);
-                       goto minus;
-
-               case Op_minus:
-                       POP_NUMBER(x2);
-minus:
-                       TOP_NUMBER(x1);
-                       r = make_number(x1 - x2);
-                       REPLACE(r);
-                       break;
-
-               case Op_times_i:
-                       x2 = force_number(pc->memory);
-                       goto times;
-
-               case Op_times:
-                       POP_NUMBER(x2);
-times:
-                       TOP_NUMBER(x1);
-                       r = make_number(x1 * x2);
-                       REPLACE(r);
-                       break;
-
-               case Op_exp_i:
-                       x2 = force_number(pc->memory);
-                       goto exponent;
-
-               case Op_exp:
-                       POP_NUMBER(x2);
-exponent:
-                       TOP_NUMBER(x1);
-                       x = calc_exp(x1, x2);
-                       r = make_number(x);
-                       REPLACE(r);
-                       break;
-
-               case Op_quotient_i:
-                       x2 = force_number(pc->memory);
-                       goto quotient;
-
-               case Op_quotient:
-                       POP_NUMBER(x2);
-quotient:
-                       if (x2 == 0)
-                               fatal(_("division by zero attempted"));
-
-                       TOP_NUMBER(x1);
-                       x = x1 / x2;
-                       r = make_number(x);
-                       REPLACE(r);
-                       break;          
-
-               case Op_mod_i:
-                       x2 = force_number(pc->memory);
-                       goto mod;
-
-               case Op_mod:
-                       POP_NUMBER(x2);
-mod:
-                       if (x2 == 0)
-                               fatal(_("division by zero attempted in `%%'"));
-
-                       TOP_NUMBER(x1);
-#ifdef HAVE_FMOD
-                       x = fmod(x1, x2);
-#else  /* ! HAVE_FMOD */
-                       (void) modf(x1 / x2, &x);
-                       x = x1 - x * x2;
-#endif /* ! HAVE_FMOD */
-                       r = make_number(x);
-                       REPLACE(r);
-                       break;          
-
-               case Op_preincrement:
-               case Op_predecrement:
-                       x2 = pc->opcode == Op_preincrement ? 1.0 : -1.0;
-                       lhs = TOP_ADDRESS();
-                       t1 = *lhs;
-                       x1 = force_number(t1);
-                       if (t1->valref == 1 && t1->flags == 
(MALLOC|NUMCUR|NUMBER)) {
-                               /* optimization */
-                               t1->numbr = x1 + x2;
-                       } else {
-                               unref(t1);
-                               t1 = *lhs = make_number(x1 + x2);
-                       }
-                       UPREF(t1);
-                       REPLACE(t1);
-                       break;
-
-               case Op_postincrement:
-               case Op_postdecrement:
-                       x2 = pc->opcode == Op_postincrement ? 1.0 : -1.0;
-                       lhs = TOP_ADDRESS();
-                       t1 = *lhs;
-                       x1 = force_number(t1);
-                       if (t1->valref == 1 && t1->flags == 
(MALLOC|NUMCUR|NUMBER)) {
-                               /* optimization */
-                               t1->numbr = x1 + x2;
-                       } else {
-                               unref(t1);
-                               *lhs = make_number(x1 + x2);
-                       }
-                       r = make_number(x1);
-                       REPLACE(r);
-                       break;
-
-               case Op_unary_minus:
-                       TOP_NUMBER(x1);
-                       r = make_number(-x1);
-                       REPLACE(r);
-                       break;
-
-               case Op_store_sub:
-                       /* array[sub] assignment optimization,
-                        * see awkgram.y (optimize_assignment)
-                        */
-                       t1 = get_array(pc->memory, TRUE);       /* array */
-                       t2 = mk_sub(pc->expr_count);    /* subscript */
-                       lhs = assoc_lookup(t1, t2);
-                       if ((*lhs)->type == Node_var_array) {
-                               t2 = force_string(t2);
-                               fatal(_("attempt to use array `%s[\"%.*s\"]' in 
a scalar context"),
-                                               array_vname(t1), (int) 
t2->stlen, t2->stptr);
-                       }
-                       DEREF(t2);
-                       unref(*lhs);
-                       *lhs = POP_SCALAR();
-                       break;
-
-               case Op_store_var:
-                       /* simple variable assignment optimization,
-                        * see awkgram.y (optimize_assignment)
-                        */
-       
-                       lhs = get_lhs(pc->memory, FALSE);
-                       unref(*lhs);
-                       r = pc->initval;        /* constant initializer */
-                       if (r == NULL)
-                               *lhs = POP_SCALAR();
-                       else {
-                               UPREF(r);
-                               *lhs = r;
-                       }
-                       break;
-
-               case Op_store_field:
-               {
-                       /* field assignment optimization,
-                        * see awkgram.y (optimize_assignment)
-                        */
-
-                       Func_ptr assign;
-                       t1 = TOP_SCALAR();
-                       lhs = r_get_field(t1, &assign, FALSE);
-                       decr_sp();
-                       DEREF(t1);
-                       unref(*lhs);
-                       *lhs = POP_SCALAR();
-                       assert(assign != NULL);
-                       assign();
-               }
-                       break;
-
-               case Op_assign_concat:
-                       /* x = x ... string concatenation optimization */
-                       lhs = get_lhs(pc->memory, FALSE);
-                       t1 = force_string(*lhs);
-                       t2 = POP_STRING();
-
-                       free_wstr(*lhs);
-
-                       if (t1 != *lhs) {
-                               unref(*lhs);
-                               *lhs = dupnode(t1);
-                       }
-
-                       if (t1 != t2 && t1->valref == 1) {
-                               size_t nlen = t1->stlen + t2->stlen;
-
-                               erealloc(t1->stptr, char *, nlen + 2, 
"r_interpret");
-                               memcpy(t1->stptr + t1->stlen, t2->stptr, 
t2->stlen);
-                               t1->stlen = nlen;
-                               t1->stptr[nlen] = '\0';
-                               t1->flags &= ~(NUMCUR|NUMBER|NUMINT);
-                       } else {
-                               size_t nlen = t1->stlen + t2->stlen;  
-                               char *p;
-
-                               emalloc(p, char *, nlen + 2, "r_interpret");
-                               memcpy(p, t1->stptr, t1->stlen);
-                               memcpy(p + t1->stlen, t2->stptr, t2->stlen);
-                               unref(*lhs);
-                               t1 = *lhs = make_str_node(p, nlen, 
ALREADY_MALLOCED); 
-                       }
-                       DEREF(t2);
-                       break;
-
-               case Op_assign:
-                       lhs = POP_ADDRESS();
-                       r = TOP_SCALAR();
-                       unref(*lhs);
-                       *lhs = r;
-                       UPREF(r);
-                       REPLACE(r);
-                       break;
+       if ((newval = getenv_long("GAWK_STACKSIZE")) > 0)
+               STACK_SIZE = newval;
 
-               /* numeric assignments */
-               case Op_assign_plus:
-               case Op_assign_minus:
-               case Op_assign_times:
-               case Op_assign_quotient:
-               case Op_assign_mod:
-               case Op_assign_exp:
-                       op_assign(pc->opcode);
-                       break;
-
-               case Op_var_update:        /* update value of NR, FNR or NF */
-                       pc->update_var();
-                       break;
-
-               case Op_var_assign:
-               case Op_field_assign:
-                       if (pc->assign_ctxt == Op_sub_builtin
-                               && TOP()->numbr == 0.0  /* top of stack has a 
number == 0 */
-                       ) {
-                               /* There wasn't any substitutions. If the 
target is a FIELD,
-                                * this means no field re-splitting or $0 
reconstruction.
-                                * Skip the set_FOO routine if the target is a 
special variable.
-                                */
-
-                               break;
-                       } else if ((pc->assign_ctxt == Op_K_getline
-                                       || pc->assign_ctxt == 
Op_K_getline_redir)
-                               && TOP()->numbr <= 0.0  /* top of stack has a 
number <= 0 */
-                       ) {
-                               /* getline returned EOF or error */
-
-                               break;
-                       }
-
-                       if (pc->opcode == Op_var_assign)
-                               pc->assign_var();
-                       else
-                               pc->field_assign();
-                       break;
-
-               case Op_concat:
-                       r = concat_exp(pc->expr_count, pc->concat_flag & 
CSUBSEP);
-                       PUSH(r);
-                       break;
-
-               case Op_K_case:
-                       if ((pc + 1)->match_exp) {
-                               /* match a constant regex against switch 
expression instead of $0. */
-
-                               m = POP();      /* regex */
-                               t2 = TOP_SCALAR();      /* switch expression */
-                               t2 = force_string(t2);
-                               rp = re_update(m);
-                               di = (research(rp, t2->stptr, 0, t2->stlen,
-                                                       avoid_dfa(m, t2->stptr, 
t2->stlen)) >= 0);
-                       } else {
-                               t1 = POP_SCALAR();      /* case value */
-                               t2 = TOP_SCALAR();      /* switch expression */
-                               di = (cmp_nodes(t2, t1) == 0);
-                               DEREF(t1);
-                       }
-
-                       if (di) {
-                               /* match found */
-
-                               t2 = POP_SCALAR();
-                               DEREF(t2);
-                               JUMPTO(pc->target_jmp);
-                       }
-                       break;
-
-               case Op_K_delete:
-                       t1 = POP_ARRAY();
-                       do_delete(t1, pc->expr_count);
-                       stack_adj(-pc->expr_count);
-                       break;
-
-               case Op_K_delete_loop:
-                       t1 = POP_ARRAY();
-                       lhs = POP_ADDRESS();    /* item */
-                       do_delete_loop(t1, lhs);
-                       break;
-
-               case Op_in_array:
-                       t1 = POP_ARRAY();
-                       t2 = mk_sub(pc->expr_count);
-                       di = (in_array(t1, t2) != NULL);
-                       DEREF(t2);
-                       PUSH(make_number((AWKNUM) di));
-                       break;
-
-               case Op_arrayfor_init:
-               {
-                       NODE **list = NULL;
-                       NODE *array, *sort_str;
-                       size_t num_elems = 0;
-                       static NODE *sorted_in = NULL;
-                       const char *how_to_sort = "@unsorted";
-
-                       /* get the array */
-                       array = POP_ARRAY();
-
-                       /* sanity: check if empty */
-                       if (array_empty(array))
-                               goto arrayfor;
-
-                       num_elems = array->table_size;
-
-                       if (sorted_in == NULL)          /* do this once */
-                               sorted_in = make_string("sorted_in", 9);
-
-                       sort_str = NULL;
-                       /*
-                        * If posix, or if there's no PROCINFO[],
-                        * there's no ["sorted_in"], so no sorting
-                        */
-                       if (! do_posix && PROCINFO_node != NULL)
-                               sort_str = in_array(PROCINFO_node, sorted_in);
-
-                       if (sort_str != NULL) {
-                               sort_str = force_string(sort_str);
-                               if (sort_str->stlen > 0)
-                                       how_to_sort = sort_str->stptr;
-                       }
-
-                       list = assoc_list(array, how_to_sort, SORTED_IN);
-
-arrayfor:
-                       getnode(r);
-                       r->type = Node_arrayfor;
-                       r->for_list = list;
-                       r->for_list_size = num_elems;           /* # of 
elements in list */
-                       r->cur_idx = -1;                        /* current 
index */
-                       r->for_array = array;           /* array */
-                       PUSH(r);
-
-                       if (num_elems == 0)
-                               JUMPTO(pc->target_jmp);   /* Op_arrayfor_final 
*/
-               }
-                       break;
-
-               case Op_arrayfor_incr:
-                       r = TOP();      /* Node_arrayfor */
-                       if (++r->cur_idx == r->for_list_size) {
-                               NODE *array;
-                               array = r->for_array;   /* actual array */
-                               if (do_lint && array->table_size != 
r->for_list_size)
-                                       lintwarn(_("for loop: array `%s' 
changed size from %ld to %ld during loop execution"),
-                                               array_vname(array), (long) 
r->for_list_size, (long) array->table_size);
-                               JUMPTO(pc->target_jmp); /* Op_arrayfor_final */
-                       }
-
-                       t1 = r->for_list[r->cur_idx];
-                       lhs = get_lhs(pc->array_var, FALSE);
-                       unref(*lhs);
-                       *lhs = dupnode(t1);
-                       break;
-
-               case Op_arrayfor_final:
-                       r = POP();
-                       assert(r->type == Node_arrayfor);
-                       free_arrayfor(r);
-                       break;
-
-               case Op_builtin:
-                       r = pc->builtin(pc->expr_count);
-                       PUSH(r);
-                       break;
-
-               case Op_ext_builtin:
-               {
-                       int arg_count = pc->expr_count;
-
-                       PUSH_CODE(pc);
-                       r = pc->builtin(arg_count);
-                       (void) POP_CODE();
-                       while (arg_count-- > 0) {
-                               t1 = POP();
-                               if (t1->type == Node_val)
-                                       DEREF(t1);
-                       }
-                       PUSH(r);
-               }
-                       break;
-
-               case Op_sub_builtin:    /* sub, gsub and gensub */
-                       r = do_sub(pc->expr_count, pc->sub_flags);
-                       PUSH(r);
-                       break;
-
-               case Op_K_print:
-                       do_print(pc->expr_count, pc->redir_type);
-                       break;
-
-               case Op_K_printf:
-                       do_printf(pc->expr_count, pc->redir_type);
-                       break;
-
-               case Op_K_print_rec:
-                       do_print_rec(pc->expr_count, pc->redir_type);
-                       break;
-
-               case Op_push_re:
-                       m = pc->memory;
-                       if (m->type == Node_dynregex) {
-                               r = POP_STRING();
-                               unref(m->re_exp);
-                               m->re_exp = r;
-                       }
-                       PUSH(m);
-                       break;
-                       
-               case Op_match_rec:
-                       m = pc->memory;
-                       t1 = *get_field(0, (Func_ptr *) 0);
-match_re:
-                       rp = re_update(m);
-                       /*
-                        * Any place where research() is called with a last 
parameter of
-                        * zero, we need to use the avoid_dfa test. This 
appears here and
-                        * in the code for Op_K_case.
-                        *
-                        * A new or improved dfa that distinguishes 
beginning/end of
-                        * string from beginning/end of line will allow us to 
get rid of
-                        * this hack.
-                        *
-                        * The avoid_dfa() function is in re.c; it is not very 
smart.
-                        */
-
-                       di = research(rp, t1->stptr, 0, t1->stlen,
-                                                               avoid_dfa(m, 
t1->stptr, t1->stlen));
-                       di = (di == -1) ^ (pc->opcode != Op_nomatch);
-                       if(pc->opcode != Op_match_rec) {
-                               decr_sp();
-                               DEREF(t1);
-                       }
-                       r = make_number((AWKNUM) di);
-                       PUSH(r);
-                       break;
-
-               case Op_nomatch:
-                       /* fall through */
-               case Op_match:
-                       m = pc->memory;
-                       t1 = TOP_STRING();
-                       if (m->type == Node_dynregex) {
-                               unref(m->re_exp);
-                               m->re_exp = t1;
-                               decr_sp();
-                               t1 = TOP_STRING();
-                       }
-                       goto match_re;
-                       break;
-
-               case Op_indirect_func_call:
-               {
-                       int arg_count;
-
-                       f = NULL;
-                       arg_count = (pc + 1)->expr_count;
-                       t1 = PEEK(arg_count);   /* indirect var */
-                       assert(t1->type == Node_val);   /* @a[1](p) not allowed 
in grammar */
-                       t1 = force_string(t1);
-                       if (t1->stlen > 0) {
-                               /* retrieve function definition node */
-                               f = pc->func_body;
-                               if (f != NULL && STREQ(f->vname, t1->stptr)) {
-                                       /* indirect var hasn't been reassigned 
*/
-
-                                       goto func_call;
-                               }
-                               f = lookup(t1->stptr);
-                       }
-
-                       if (f == NULL || f->type != Node_func)
-                               fatal(_("function called indirectly through 
`%s' does not exist"),
-                                               pc->func_name); 
-                       pc->func_body = f;     /* save for next call */
-
-                       goto func_call;
-               }
-
-               case Op_func_call:
-                       /* retrieve function definition node */
-                       f = pc->func_body;
-                       if (f == NULL) {
-                               f = lookup(pc->func_name);
-                               if (f == NULL || (f->type != Node_func && 
f->type != Node_ext_func))
-                                       fatal(_("function `%s' not defined"), 
pc->func_name);
-                               pc->func_body = f;     /* save for next call */
-                       }
-
-                       if (f->type == Node_ext_func) {
-                               INSTRUCTION *bc;
-                               char *fname = pc->func_name;
-                               int arg_count = (pc + 1)->expr_count;
-
-                               bc = f->code_ptr;
-                               assert(bc->opcode == Op_symbol);
-                               pc->opcode = Op_ext_builtin;    /* self 
modifying code */
-                               pc->builtin = bc->builtin;
-                               pc->expr_count = arg_count;             /* 
actual argument count */
-                               (pc + 1)->func_name = fname;    /* name of the 
builtin */
-                               (pc + 1)->expr_count = bc->expr_count;  /* 
defined max # of arguments */
-                               ni = pc; 
-                               JUMPTO(ni);
-                       }
-
-func_call:
-                       ni = setup_frame(pc);
-                                               
-                       /* run the function instructions */
-                       JUMPTO(ni);             /* Op_func */
-
-               case Op_K_return:
-                       m = POP_SCALAR();       /* return value */
-
-                       ni = pop_fcall();
-       
-                       /* put the return value back on stack */
-                       PUSH(m);
-
-                       JUMPTO(ni);
-
-               case Op_K_getline_redir:
-                       if ((currule == BEGINFILE || currule == ENDFILE)
-                                       && pc->into_var == FALSE
-                                       && pc->redir_type == redirect_input)
-                               fatal(_("`getline' invalid inside `%s' rule"), 
ruletab[currule]);
-                       r = do_getline_redir(pc->into_var, pc->redir_type);
-                       PUSH(r);
-                       break;
-
-               case Op_K_getline:      /* no redirection */
-                       if (! currule || currule == BEGINFILE || currule == 
ENDFILE)
-                               fatal(_("non-redirected `getline' invalid 
inside `%s' rule"),
-                                               ruletab[currule]);
-
-                       do {
-                               int ret;
-                               ret = nextfile(& curfile, FALSE);
-                               if (ret <= 0)
-                                       r = do_getline(pc->into_var, curfile);
-                               else {
-
-                                       /* Save execution state so that we can 
return to it
-                                        * from Op_after_beginfile or 
Op_after_endfile.
-                                        */ 
-
-                                       push_exec_state(pc, currule, source, 
stack_ptr);
-
-                                       if (curfile == NULL)
-                                               JUMPTO((pc + 
1)->target_endfile);
-                                       else
-                                               JUMPTO((pc + 
1)->target_beginfile);
-                               }
-                       } while (r == NULL);    /* EOF */
-
-                       PUSH(r);
-                       break;
-
-               case Op_after_endfile:
-                       /* Find the execution state to return to */
-                       ni = pop_exec_state(& currule, & source, NULL);
-
-                       assert(ni->opcode == Op_newfile || ni->opcode == 
Op_K_getline);
-                       JUMPTO(ni);
-
-               case Op_after_beginfile:
-                       after_beginfile(& curfile);
-
-                       /* Find the execution state to return to */
-                       ni = pop_exec_state(& currule, & source, NULL);
-
-                       assert(ni->opcode == Op_newfile || ni->opcode == 
Op_K_getline);
-                       if (ni->opcode == Op_K_getline
-                                       || curfile == NULL      /* skipping 
directory argument */
-                       )
-                               JUMPTO(ni);
-
-                       break;  /* read a record, Op_get_record */
-
-               case Op_newfile:
-               {
-                       int ret;
-
-                       ret = nextfile(& curfile, FALSE);
-
-                       if (ret < 0)    /* end of input */
-                               JUMPTO(pc->target_jmp); /* end block or 
Op_atexit */
-
-                       if (ret == 0) /* read a record */
-                               JUMPTO((pc + 1)->target_get_record);
-
-                       /* ret > 0 */
-                       /* Save execution state for use in Op_after_beginfile 
or Op_after_endfile. */
-
-                       push_exec_state(pc, currule, source, stack_ptr);
-
-                       if (curfile == NULL)    /* EOF */
-                               JUMPTO(pc->target_endfile);
-                       /* else
-                               execute beginfile block */
-               }
-                       break;
-                       
-               case Op_get_record:             
-               {
-                       int errcode = 0;
-
-                       ni = pc->target_newfile;
-                       if (curfile == NULL) {
-                               /* from non-redirected getline, e.g.:
-                                *  {
-                                *              while (getline > 0) ;
-                                *  }
-                                */
-
-                               ni = ni->target_jmp;    /* end_block or 
Op_atexit */
-                               JUMPTO(ni);
-                       }
-
-                       if (inrec(curfile, & errcode) != 0) {
-                               if (errcode > 0 && (do_traditional || ! 
pc->has_endfile))
-                                       fatal(_("error reading input file `%s': 
%s"),
-                                               curfile->name, 
strerror(errcode));
-
-                               JUMPTO(ni);
-                       } /* else
-                               prog (rule) block */
-               }
-                       break;
-
-               case Op_K_nextfile:
-               {
-                       int ret;
-
-                       if (currule != Rule && currule != BEGINFILE)
-                               fatal(_("`nextfile' cannot be called from a 
`%s' rule"),
-                                       ruletab[currule]);
-
-                       ret = nextfile(& curfile, TRUE);        /* skip current 
file */
-
-                       if (currule == BEGINFILE) {
-                               long stack_size;
-
-                               ni = pop_exec_state(& currule, & source, & 
stack_size);
-
-                               assert(ni->opcode == Op_K_getline || ni->opcode 
== Op_newfile);
-
-                               /* pop stack returning to the state of 
Op_K_getline or Op_newfile. */
-                               unwind_stack(stack_size);
-
-                               if (ret == 0) {
-                                       /* There was an error opening the file;
-                                        * don't run ENDFILE block(s).
-                                        */
-
-                                       JUMPTO(ni);
-                               } else {
-                                       /* do run ENDFILE block(s) first. */
-                                       
-                                       /* Execution state to return to in 
Op_after_endfile. */
-                                       push_exec_state(ni, currule, source, 
stack_ptr);
-
-                                       JUMPTO(pc->target_endfile);
-                               }                               
-                       } /* else 
-                               Start over with the first rule. */
-
-                       /* empty the run-time stack to avoid memory leak */
-                       pop_stack();
-
-                       /* Push an execution state for Op_after_endfile to 
return to */
-                       push_exec_state(pc->target_newfile, currule, source, 
stack_ptr);
-
-                       JUMPTO(pc->target_endfile);
-               }
-                       break;
-
-               case Op_K_exit:
-                       /* exit not allowed in user-defined comparison 
functions for "sorted_in";
-                        * This is done so that END blocks aren't executed more 
than once.
-                        */
-                       if (! currule)
-                               fatal(_("`exit' cannot be called in the current 
context"));
-
-                       exiting = TRUE;
-                       POP_NUMBER(x1);
-                       exit_val = (int) x1;
-#ifdef VMS
-                       if (exit_val == 0)
-                               exit_val = EXIT_SUCCESS;
-                       else if (exit_val == 1)
-                               exit_val = EXIT_FAILURE;
-                       /* else
-                               just pass anything else on through */
-#endif
-
-                       if (currule == BEGINFILE || currule == ENDFILE) {
-
-                               /* Find the rule of the saved execution state 
(Op_K_getline/Op_newfile).
-                                * This is needed to prevent multiple execution 
of any END rules:
-                                *      gawk 'BEGINFILE { exit(1) } \
-                                *         END { while (getline > 0); }' in1 in2
-                                */
-
-                               (void) pop_exec_state(& currule, & source, 
NULL);
-                       }
-
-                       pop_stack();    /* empty stack, don't leak memory */
-
-                       /* Jump to either the first END block instruction
-                        * or to Op_atexit.
-                        */
-
-                       if (currule == END)
-                               ni = pc->target_atexit;
-                       else
-                               ni = pc->target_end;
-                       JUMPTO(ni);
-
-               case Op_K_next:
-                       if (currule != Rule)
-                               fatal(_("`next' cannot be called from a `%s' 
rule"), ruletab[currule]);
-
-                       pop_stack();
-                       JUMPTO(pc->target_jmp); /* Op_get_record, read next 
record */
-
-               case Op_pop:
-                       r = POP_SCALAR();
-                       DEREF(r);
-                       break;
-
-               case Op_line_range:
-                       if (pc->triggered)              /* evaluate right 
expression */
-                               JUMPTO(pc->target_jmp);
-                       /* else
-                               evaluate left expression */
-                       break;
-
-               case Op_cond_pair:
-               {
-                       int result;
-                       INSTRUCTION *ip;
-
-                       t1 = TOP_SCALAR();   /* from right hand side expression 
*/
-                       di = (eval_condition(t1) != 0);
-                       DEREF(t1);
-
-                       ip = pc->line_range;            /* Op_line_range */
-
-                       if (! ip->triggered && di) {
-                               /* not already triggered and left expression is 
TRUE */
-                               decr_sp();
-                               ip->triggered = TRUE;
-                               JUMPTO(ip->target_jmp); /* evaluate right 
expression */ 
-                       }
-
-                       result = ip->triggered || di;
-                       ip->triggered ^= di;          /* update triggered flag 
*/
-                       r = make_number((AWKNUM) result);      /* final value 
of condition pair */
-                       REPLACE(r);
-                       JUMPTO(pc->target_jmp);
-               }
+       emalloc(stack_bottom, STACK_ITEM *, STACK_SIZE * sizeof(STACK_ITEM), 
"grow_stack");
+       stack_ptr = stack_bottom - 1;
+       stack_top = stack_bottom + STACK_SIZE - 1;
 
-               case Op_exec_count:
-                       INCREMENT(pc->exec_count);
-                       break;
+       /* initialize frame pointer */
+       getnode(frame_ptr);
+       frame_ptr->type = Node_frame;
+       frame_ptr->stack = NULL;
+       frame_ptr->func_node = NULL;    /* in main */
+       frame_ptr->num_tail_calls = 0;
+       frame_ptr->vname = NULL;
 
-               case Op_no_op:
-               case Op_K_do:
-               case Op_K_while:
-               case Op_K_for:
-               case Op_K_arrayfor:
-               case Op_K_switch:
-               case Op_K_default:
-               case Op_K_if:
-               case Op_K_else:
-               case Op_cond_exp:
-                       break;
+       /* initialize TRUE and FALSE nodes */
+       node_Boolean[FALSE] = make_number(0);
+       node_Boolean[FALSE]->flags |= NUMINT;
+       node_Boolean[TRUE] = make_number(1.0);
+       node_Boolean[TRUE]->flags |= NUMINT;
 
-               default:
-                       fatal(_("Sorry, don't know how to interpret `%s'"), 
opcode2str(pc->opcode));
-               }
+       /* select the interpreter routine */
+       if (do_debug)
+               interpret = debug_interpret;
+       else
+               interpret = r_interpret;
+}
 
-               JUMPTO(pc->nexti);
 
-/*     } forever */
+/* interpreter routine when not debugging */ 
+#include "interpret.h"
 
-       /* not reached */
-       return 0;
+/* interpreter routine when deubugging with gawk --debug  */
+#define r_interpret debug_interpret
+#define DEBUGGING 1
+#include "interpret.h"
+#undef DEBUGGING
+#undef r_interpret
 
-#undef mk_sub
-#undef JUMPTO
-}
diff --git a/eval_d.c b/eval_d.c
deleted file mode 100644
index 64a8e55..0000000
--- a/eval_d.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * eval_p.c - compile eval.c with debugging turned on.
- */
-
-/* 
- * Copyright (C) 2001 the Free Software Foundation, Inc.
- * 
- * This file is part of GAWK, the GNU implementation of the
- * AWK Programming Language.
- * 
- * GAWK 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 of the License, or
- * (at your option) any later version.
- * 
- * GAWK 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
- */
-
-#define DEBUGGING 1
-#include "eval.c"
diff --git a/eval_p.c b/eval_p.c
deleted file mode 100644
index c8afe66..0000000
--- a/eval_p.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * eval_p.c - compile eval.c with profiling turned on.
- */
-
-/* 
- * Copyright (C) 2001 the Free Software Foundation, Inc.
- * 
- * This file is part of GAWK, the GNU implementation of the
- * AWK Programming Language.
- * 
- * GAWK 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 3 of the License, or
- * (at your option) any later version.
- * 
- * GAWK 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
USA
- */
-
-#define PROFILING 1
-#include "eval.c"
diff --git a/ext.c b/ext.c
index 19e0eec..39e512f 100644
--- a/ext.c
+++ b/ext.c
@@ -37,18 +37,37 @@
 static unsigned long long dummy;       /* fake out gcc for dynamic loading? */
 #endif
 
-/* do_ext --- load an extension */
-
+/* do_ext --- load an extension at run-time: interface to load_ext */
+ 
 NODE *
 do_ext(int nargs)
 {
-       NODE *obj;
-       NODE *fun;
+       NODE *obj, *fun, *ret = NULL;
+       SRCFILE *s;
+       extern SRCFILE *srcfiles;
+
+       fun = POP_STRING();
+       obj = POP_STRING();
+
+       s = add_srcfile(SRC_EXTLIB, obj->stptr, srcfiles, NULL, NULL);
+       if (s != NULL)
+               ret = load_ext(s->fullpath, fun->stptr, obj);
+       DEREF(obj);
+       DEREF(fun);
+       if (ret == NULL)
+               ret = dupnode(Nnull_string);
+       return ret;
+}
+
+/* load_ext --- load an external library */
+
+NODE *
+load_ext(const char *lib_name, const char *init_func, NODE *obj)
+{
        NODE *tmp = NULL;
        NODE *(*func)(NODE *, void *);
        void *dl;
        int flags = RTLD_LAZY;
-       int fatal_error = FALSE;
        int *gpl_compat;
 
 #ifdef __GNUC__
@@ -61,47 +80,36 @@ do_ext(int nargs)
                fatal(_("extensions are not allowed in sandbox mode"));
 
        if (do_traditional || do_posix)
-               error(_("`extension' is a gawk extension"));
-
-       fun = POP_STRING();
-       obj = POP_STRING();
+               fatal(_("`extension' is a gawk extension"));
 
 #ifdef RTLD_GLOBAL
        flags |= RTLD_GLOBAL;
 #endif
-       if ((dl = dlopen(obj->stptr, flags)) == NULL) {
-               /* fatal needs `obj', and we need to deallocate it! */
-               msg(_("fatal: extension: cannot open `%s' (%s)\n"), obj->stptr,
+
+       if ((dl = dlopen(lib_name, flags)) == NULL)
+               fatal(_("extension: cannot open library `%s' (%s)\n"), lib_name,
                      dlerror());
-               fatal_error = TRUE;
-               goto done;
-       }
 
        /* Per the GNU Coding standards */
        gpl_compat = (int *) dlsym(dl, "plugin_is_GPL_compatible");
-       if (gpl_compat == NULL) {
-               msg(_("fatal: extension: library `%s': does not define 
`plugin_is_GPL_compatible' (%s)\n"),
-                               obj->stptr, dlerror());
-               fatal_error = TRUE;
-               goto done;
-       }
-
-       func = (NODE *(*)(NODE *, void *)) dlsym(dl, fun->stptr);
-       if (func == NULL) {
-               msg(_("fatal: extension: library `%s': cannot call function 
`%s' (%s)\n"),
-                               obj->stptr, fun->stptr, dlerror());
-               fatal_error = TRUE;
-               goto done;
+       if (gpl_compat == NULL)
+               fatal(_("extension: library `%s': does not define 
`plugin_is_GPL_compatible' (%s)\n"),
+                               lib_name, dlerror());
+
+       func = (NODE *(*)(NODE *, void *)) dlsym(dl, init_func);
+       if (func == NULL)
+               fatal(_("extension: library `%s': cannot call function `%s' 
(%s)\n"),
+                               lib_name, init_func, dlerror());
+
+       if (obj == NULL) {
+               obj = make_string(lib_name, strlen(lib_name));
+               tmp = (*func)(obj, dl);
+               unref(tmp);
+               unref(obj);
+               return NULL;
        }
 
        tmp = (*func)(obj, dl);
-       if (tmp == NULL)
-               tmp = dupnode(Nnull_string);
-done:
-       DEREF(obj);
-       DEREF(fun);
-       if (fatal_error)
-               gawk_exit(EXIT_FATAL);
        return tmp; 
 }
 
@@ -173,8 +181,11 @@ get_argument(int i)
 
        if (i < 0 || i >= pcount || i >= arg_count)
                return NULL;
-       i++;
-       t = PEEK(i);
+
+       t = PEEK(arg_count - i);
+       if (t->type == Node_param_list)
+               t = GET_PARAM(t->param_cnt);
+
        if (t->type == Node_array_ref)
                t = t->orig_array;
        if (t->type == Node_var)        /* See Case Node_var in setup_frame(), 
eval.c */
@@ -247,4 +258,13 @@ do_ext(int nargs)
        ERRNO_node->var_value = make_string(emsg, strlen(emsg));
        return make_number((AWKNUM) -1);
 }
+
+/* load_ext --- dummy version if extensions not available */
+
+NODE *
+load_ext(const char *lib_name, const char *init_func, NODE *obj)
+{
+       fatal(_("dynamic loading of library not supported"));
+       return NULL;
+}
 #endif
diff --git a/int_array.c b/int_array.c
index fd58de2..200431f 100644
--- a/int_array.c
+++ b/int_array.c
@@ -290,7 +290,8 @@ int_remove(NODE *symbol, NODE *subs)
        int i;
        NODE *xn = symbol->xarray;
 
-       assert(symbol->buckets != NULL);
+       if (symbol->table_size == 0 || symbol->buckets == NULL)
+               return NULL;
 
        if (! is_integer(symbol, subs)) {
                if (xn == NULL || xn->aremove(xn, subs) == NULL)
@@ -462,7 +463,8 @@ int_list(NODE *symbol, NODE *t)
        long num;
        static char buf[100];
 
-       assert(symbol->table_size > 0);
+       if (symbol->table_size == 0)
+               return NULL;
 
        num_elems = symbol->table_size;
        if ((t->flags & (AINDEX|AVALUE|ADELETE)) == (AINDEX|ADELETE))
diff --git a/interpret.h b/interpret.h
new file mode 100644
index 0000000..66f5b0d
--- /dev/null
+++ b/interpret.h
@@ -0,0 +1,1187 @@
+/*
+ * interpret:
+ *   code is a list of instructions to run. returns the exit value
+ *      from the awk code.
+ */
+ 
+ /* N.B.:
+ *   1) reference counting done for both number and string values.
+ *   2) Stack operations:
+ *       Use REPLACE[_XX] if last stack operation was TOP[_XX],
+ *       PUSH[_XX] if last operation was POP[_XX] instead. 
+ *   3) UPREF and DREF -- see awk.h 
+ */
+
+int
+r_interpret(INSTRUCTION *code)
+{
+       INSTRUCTION *pc;   /* current instruction */
+       NODE *r = NULL;
+       NODE *m;
+       INSTRUCTION *ni;
+       NODE *t1, *t2;
+       NODE *f;        /* function definition */
+       NODE **lhs;
+       AWKNUM x, x1, x2;
+       int di;
+       Regexp *rp;
+       int stdio_problem = FALSE;
+
+/* array subscript */
+#define mk_sub(n)      (n == 1 ? POP_SCALAR() : concat_exp(n, TRUE))
+
+#ifdef DEBUGGING
+#define JUMPTO(x)      do { post_execute(pc); pc = (x); goto top; } while 
(FALSE)
+#else
+#define JUMPTO(x)      do { pc = (x); goto top; } while (FALSE)
+#endif
+
+       pc = code;
+
+       /* N.B.: always use JUMPTO for next instruction, otherwise bad things
+        * may happen. DO NOT add a real loop (for/while) below to
+        * replace ' forever {'; this catches failure to use JUMPTO to execute
+        * next instruction (e.g. continue statement).
+        */
+
+       /* loop until hit Op_stop instruction */
+
+       /* forever {  */
+top:
+               if (pc->source_line > 0)
+                       sourceline = pc->source_line;
+
+#ifdef DEBUGGING
+               if (! pre_execute(&pc))
+                       goto top;
+#endif
+
+               switch (pc->opcode) {
+               case Op_rule:
+                       currule = pc->in_rule;   /* for sole use in Op_K_next, 
Op_K_nextfile, Op_K_getline */
+                       /* fall through */
+               case Op_func:
+                       source = pc->source_file;
+                       break;
+
+               case Op_atexit:
+                       /* avoid false source indications */
+                       source = NULL;
+                       sourceline = 0;
+                       (void) nextfile(& curfile, TRUE);       /* close input 
data file */ 
+                       /*
+                        * This used to be:
+                        *
+                        * if (close_io() != 0 && ! exiting && exit_val == 0)
+                        *      exit_val = 1;
+                        *
+                        * Other awks don't care about problems closing open 
files
+                        * and pipes, in that it doesn't affect their exit 
status.
+                        * So we no longer do either.
+                        */
+                       (void) close_io(& stdio_problem);
+                       /*
+                        * However, we do want to exit non-zero if there was a 
problem
+                        * with stdout/stderr, so we reinstate a slightly 
different
+                        * version of the above:
+                        */
+                       if (stdio_problem && ! exiting && exit_val == 0)
+                               exit_val = 1;
+                       break;
+
+               case Op_stop:
+                       return 0;
+
+               case Op_push_i:
+                       m = pc->memory;
+                       if (! do_traditional && (m->flags & INTLSTR) != 0) {
+                               char *orig, *trans, save;
+
+                               save = m->stptr[m->stlen];
+                               m->stptr[m->stlen] = '\0';
+                               orig = m->stptr;
+                               trans = dgettext(TEXTDOMAIN, orig);
+                               m->stptr[m->stlen] = save;
+                               m = make_string(trans, strlen(trans));
+                       } else
+                               UPREF(m);
+                       PUSH(m);
+                       break;
+
+               case Op_push:
+               case Op_push_arg:
+               {
+                       NODE *save_symbol;
+                       int isparam = FALSE;
+
+                       save_symbol = m = pc->memory;
+                       if (m->type == Node_param_list) {
+                               isparam = TRUE;
+                               save_symbol = m = GET_PARAM(m->param_cnt);
+                               if (m->type == Node_array_ref)
+                                       m = m->orig_array;
+                       }
+                               
+                       switch (m->type) {
+                       case Node_var:
+                               if (do_lint && var_uninitialized(m))
+                                       lintwarn(isparam ?
+                                               _("reference to uninitialized 
argument `%s'") :
+                                               _("reference to uninitialized 
variable `%s'"),
+                                                               
save_symbol->vname);
+                               m = m->var_value;
+                               UPREF(m);
+                               PUSH(m);
+                               break;
+
+                       case Node_var_new:
+                               m->type = Node_var;
+                               m->var_value = dupnode(Nnull_string);
+                               if (do_lint)
+                                       lintwarn(isparam ?
+                                               _("reference to uninitialized 
argument `%s'") :
+                                               _("reference to uninitialized 
variable `%s'"),
+                                                               
save_symbol->vname);
+                               m = dupnode(Nnull_string);
+                               PUSH(m);
+                               break;
+
+                       case Node_var_array:
+                               if (pc->opcode == Op_push_arg)
+                                       PUSH(m);
+                               else
+                                       fatal(_("attempt to use array `%s' in a 
scalar context"),
+                                                       
array_vname(save_symbol));
+                               break;
+
+                       default:
+                               cant_happen();
+                       }
+               }
+                       break;  
+
+               case Op_push_param:             /* function argument */
+                       m = pc->memory;
+                       if (m->type == Node_param_list)
+                               m = GET_PARAM(m->param_cnt);
+                       if (m->type == Node_var) {
+                               m = m->var_value;
+                               UPREF(m);
+                               PUSH(m);
+                               break;
+                       }
+                       /* else
+                               fall through */
+               case Op_push_array:
+                       PUSH(pc->memory);
+                       break;
+
+               case Op_push_lhs:
+                       lhs = get_lhs(pc->memory, pc->do_reference);
+                       PUSH_ADDRESS(lhs);
+                       break;
+
+               case Op_subscript:
+                       t2 = mk_sub(pc->sub_count);
+                       t1 = POP_ARRAY();
+
+                       if (do_lint && in_array(t1, t2) == NULL) {
+                               t2 = force_string(t2);
+                               lintwarn(_("reference to uninitialized element 
`%s[\"%.*s\"]'"),
+                                       array_vname(t1), (int) t2->stlen, 
t2->stptr);
+                               if (t2->stlen == 0)
+                                       lintwarn(_("subscript of array `%s' is 
null string"), array_vname(t1));
+                       }
+
+                       r = *assoc_lookup(t1, t2);
+                       DEREF(t2);
+                       if (r->type == Node_val)
+                               UPREF(r);
+                       PUSH(r);
+                       break;
+
+               case Op_sub_array:
+                       t2 = mk_sub(pc->sub_count);
+                       t1 = POP_ARRAY();
+                       r = in_array(t1, t2);
+                       if (r == NULL) {
+                               r = make_array();
+                               r->parent_array = t1;
+                               *assoc_lookup(t1, t2) = r;
+                               t2 = force_string(t2);
+                               r->vname = estrdup(t2->stptr, t2->stlen);       
/* the subscript in parent array */
+                       } else if (r->type != Node_var_array) {
+                               t2 = force_string(t2);
+                               fatal(_("attempt to use scalar `%s[\"%.*s\"]' 
as an array"),
+                                               array_vname(t1), (int) 
t2->stlen, t2->stptr);
+                       }
+
+                       DEREF(t2);
+                       PUSH(r);
+                       break;
+
+               case Op_subscript_lhs:
+                       t2 = mk_sub(pc->sub_count);
+                       t1 = POP_ARRAY();
+                       if (do_lint && in_array(t1, t2) == NULL) {
+                               t2 = force_string(t2);
+                               if (pc->do_reference) 
+                                       lintwarn(_("reference to uninitialized 
element `%s[\"%.*s\"]'"),
+                                               array_vname(t1), (int) 
t2->stlen, t2->stptr);
+                               if (t2->stlen == 0)
+                                       lintwarn(_("subscript of array `%s' is 
null string"), array_vname(t1));
+                       }
+
+                       lhs = assoc_lookup(t1, t2);
+                       if ((*lhs)->type == Node_var_array) {
+                               t2 = force_string(t2);
+                               fatal(_("attempt to use array `%s[\"%.*s\"]' in 
a scalar context"),
+                                               array_vname(t1), (int) 
t2->stlen, t2->stptr);
+                       }
+
+                       DEREF(t2);
+                       PUSH_ADDRESS(lhs);
+                       break;
+
+               case Op_field_spec:
+                       t1 = TOP_SCALAR();
+                       lhs = r_get_field(t1, (Func_ptr *) 0, TRUE);
+                       decr_sp();
+                       DEREF(t1);
+                       r = dupnode(*lhs);     /* can't use UPREF here */
+                       PUSH(r);
+                       break;
+
+               case Op_field_spec_lhs:
+                       t1 = TOP_SCALAR();
+                       lhs = r_get_field(t1, &pc->target_assign->field_assign, 
pc->do_reference);
+                       decr_sp();
+                       DEREF(t1);
+                       PUSH_ADDRESS(lhs);
+                       break;
+
+               case Op_lint:
+                       if (do_lint) {
+                               switch (pc->lint_type) {
+                               case LINT_assign_in_cond:
+                                       lintwarn(_("assignment used in 
conditional context"));
+                                       break;
+
+                               case LINT_no_effect:
+                                       lintwarn(_("statement has no effect"));
+                                       break;
+
+                               default:
+                                       cant_happen();
+                               }
+                       }
+                       break;
+
+               case Op_K_break:
+               case Op_K_continue:
+               case Op_jmp:
+                       JUMPTO(pc->target_jmp);
+
+               case Op_jmp_false:
+                       r = POP_SCALAR();
+                       di = eval_condition(r);
+                       DEREF(r);
+                       if (! di)
+                               JUMPTO(pc->target_jmp);
+                       break;
+
+               case Op_jmp_true:
+                       r = POP_SCALAR();
+                       di = eval_condition(r);
+                       DEREF(r);                       
+                       if (di)
+                               JUMPTO(pc->target_jmp);
+                       break;
+
+               case Op_and:
+               case Op_or:
+                       t1 = POP_SCALAR();
+                       di = eval_condition(t1);
+                       DEREF(t1);
+                       if ((pc->opcode == Op_and && di)
+                                       || (pc->opcode == Op_or && ! di))
+                               break;
+                       r = node_Boolean[di];
+                       UPREF(r);
+                       PUSH(r);
+                       ni = pc->target_jmp;
+                       JUMPTO(ni->nexti);
+
+               case Op_and_final:
+               case Op_or_final:
+                       t1 = TOP_SCALAR();
+                       r = node_Boolean[eval_condition(t1)];
+                       DEREF(t1);
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               case Op_not:
+                       t1 = TOP_SCALAR();
+                       r = node_Boolean[! eval_condition(t1)];
+                       DEREF(t1);
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               case Op_equal:
+                       r = node_Boolean[cmp_scalar() == 0];
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               case Op_notequal:
+                       r = node_Boolean[cmp_scalar() != 0];
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               case Op_less:
+                       r = node_Boolean[cmp_scalar() < 0];
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               case Op_greater:
+                       r = node_Boolean[cmp_scalar() > 0];
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               case Op_leq:
+                       r = node_Boolean[cmp_scalar() <= 0];
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               case Op_geq:
+                       r = node_Boolean[cmp_scalar() >= 0];
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               case Op_plus_i:
+                       x2 = force_number(pc->memory);
+                       goto plus;
+
+               case Op_plus:
+                       POP_NUMBER(x2);
+plus:
+                       TOP_NUMBER(x1);
+                       r = make_number(x1 + x2);
+                       REPLACE(r);
+                       break;
+
+               case Op_minus_i:
+                       x2 = force_number(pc->memory);
+                       goto minus;
+
+               case Op_minus:
+                       POP_NUMBER(x2);
+minus:
+                       TOP_NUMBER(x1);
+                       r = make_number(x1 - x2);
+                       REPLACE(r);
+                       break;
+
+               case Op_times_i:
+                       x2 = force_number(pc->memory);
+                       goto times;
+
+               case Op_times:
+                       POP_NUMBER(x2);
+times:
+                       TOP_NUMBER(x1);
+                       r = make_number(x1 * x2);
+                       REPLACE(r);
+                       break;
+
+               case Op_exp_i:
+                       x2 = force_number(pc->memory);
+                       goto exponent;
+
+               case Op_exp:
+                       POP_NUMBER(x2);
+exponent:
+                       TOP_NUMBER(x1);
+                       x = calc_exp(x1, x2);
+                       r = make_number(x);
+                       REPLACE(r);
+                       break;
+
+               case Op_quotient_i:
+                       x2 = force_number(pc->memory);
+                       goto quotient;
+
+               case Op_quotient:
+                       POP_NUMBER(x2);
+quotient:
+                       if (x2 == 0)
+                               fatal(_("division by zero attempted"));
+
+                       TOP_NUMBER(x1);
+                       x = x1 / x2;
+                       r = make_number(x);
+                       REPLACE(r);
+                       break;          
+
+               case Op_mod_i:
+                       x2 = force_number(pc->memory);
+                       goto mod;
+
+               case Op_mod:
+                       POP_NUMBER(x2);
+mod:
+                       if (x2 == 0)
+                               fatal(_("division by zero attempted in `%%'"));
+
+                       TOP_NUMBER(x1);
+#ifdef HAVE_FMOD
+                       x = fmod(x1, x2);
+#else  /* ! HAVE_FMOD */
+                       (void) modf(x1 / x2, &x);
+                       x = x1 - x * x2;
+#endif /* ! HAVE_FMOD */
+                       r = make_number(x);
+                       REPLACE(r);
+                       break;          
+
+               case Op_preincrement:
+               case Op_predecrement:
+                       x2 = pc->opcode == Op_preincrement ? 1.0 : -1.0;
+                       lhs = TOP_ADDRESS();
+                       t1 = *lhs;
+                       x1 = force_number(t1);
+                       if (t1->valref == 1 && t1->flags == 
(MALLOC|NUMCUR|NUMBER)) {
+                               /* optimization */
+                               t1->numbr = x1 + x2;
+                       } else {
+                               unref(t1);
+                               t1 = *lhs = make_number(x1 + x2);
+                       }
+                       UPREF(t1);
+                       REPLACE(t1);
+                       break;
+
+               case Op_postincrement:
+               case Op_postdecrement:
+                       x2 = pc->opcode == Op_postincrement ? 1.0 : -1.0;
+                       lhs = TOP_ADDRESS();
+                       t1 = *lhs;
+                       x1 = force_number(t1);
+                       if (t1->valref == 1 && t1->flags == 
(MALLOC|NUMCUR|NUMBER)) {
+                               /* optimization */
+                               t1->numbr = x1 + x2;
+                       } else {
+                               unref(t1);
+                               *lhs = make_number(x1 + x2);
+                       }
+                       r = make_number(x1);
+                       REPLACE(r);
+                       break;
+
+               case Op_unary_minus:
+                       TOP_NUMBER(x1);
+                       r = make_number(-x1);
+                       REPLACE(r);
+                       break;
+
+               case Op_store_sub:
+                       /* array[sub] assignment optimization,
+                        * see awkgram.y (optimize_assignment)
+                        */
+                       t1 = get_array(pc->memory, TRUE);       /* array */
+                       t2 = mk_sub(pc->expr_count);    /* subscript */
+                       lhs = assoc_lookup(t1, t2);
+                       if ((*lhs)->type == Node_var_array) {
+                               t2 = force_string(t2);
+                               fatal(_("attempt to use array `%s[\"%.*s\"]' in 
a scalar context"),
+                                               array_vname(t1), (int) 
t2->stlen, t2->stptr);
+                       }
+                       DEREF(t2);
+                       unref(*lhs);
+                       *lhs = POP_SCALAR();
+                       break;
+
+               case Op_store_var:
+                       /* simple variable assignment optimization,
+                        * see awkgram.y (optimize_assignment)
+                        */
+       
+                       lhs = get_lhs(pc->memory, FALSE);
+                       unref(*lhs);
+                       r = pc->initval;        /* constant initializer */
+                       if (r == NULL)
+                               *lhs = POP_SCALAR();
+                       else {
+                               UPREF(r);
+                               *lhs = r;
+                       }
+                       break;
+
+               case Op_store_field:
+               {
+                       /* field assignment optimization,
+                        * see awkgram.y (optimize_assignment)
+                        */
+
+                       Func_ptr assign;
+                       t1 = TOP_SCALAR();
+                       lhs = r_get_field(t1, &assign, FALSE);
+                       decr_sp();
+                       DEREF(t1);
+                       unref(*lhs);
+                       *lhs = POP_SCALAR();
+                       assert(assign != NULL);
+                       assign();
+               }
+                       break;
+
+               case Op_assign_concat:
+                       /* x = x ... string concatenation optimization */
+                       lhs = get_lhs(pc->memory, FALSE);
+                       t1 = force_string(*lhs);
+                       t2 = POP_STRING();
+
+                       free_wstr(*lhs);
+
+                       if (t1 != *lhs) {
+                               unref(*lhs);
+                               *lhs = dupnode(t1);
+                       }
+
+                       if (t1 != t2 && t1->valref == 1) {
+                               size_t nlen = t1->stlen + t2->stlen;
+
+                               erealloc(t1->stptr, char *, nlen + 2, 
"r_interpret");
+                               memcpy(t1->stptr + t1->stlen, t2->stptr, 
t2->stlen);
+                               t1->stlen = nlen;
+                               t1->stptr[nlen] = '\0';
+                               t1->flags &= ~(NUMCUR|NUMBER|NUMINT);
+                       } else {
+                               size_t nlen = t1->stlen + t2->stlen;  
+                               char *p;
+
+                               emalloc(p, char *, nlen + 2, "r_interpret");
+                               memcpy(p, t1->stptr, t1->stlen);
+                               memcpy(p + t1->stlen, t2->stptr, t2->stlen);
+                               unref(*lhs);
+                               t1 = *lhs = make_str_node(p, nlen, 
ALREADY_MALLOCED); 
+                       }
+                       DEREF(t2);
+                       break;
+
+               case Op_assign:
+                       lhs = POP_ADDRESS();
+                       r = TOP_SCALAR();
+                       unref(*lhs);
+                       *lhs = r;
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
+               /* numeric assignments */
+               case Op_assign_plus:
+               case Op_assign_minus:
+               case Op_assign_times:
+               case Op_assign_quotient:
+               case Op_assign_mod:
+               case Op_assign_exp:
+                       op_assign(pc->opcode);
+                       break;
+
+               case Op_var_update:        /* update value of NR, FNR or NF */
+                       pc->update_var();
+                       break;
+
+               case Op_var_assign:
+               case Op_field_assign:
+                       if (pc->assign_ctxt == Op_sub_builtin
+                               && TOP()->numbr == 0.0  /* top of stack has a 
number == 0 */
+                       ) {
+                               /* There wasn't any substitutions. If the 
target is a FIELD,
+                                * this means no field re-splitting or $0 
reconstruction.
+                                * Skip the set_FOO routine if the target is a 
special variable.
+                                */
+
+                               break;
+                       } else if ((pc->assign_ctxt == Op_K_getline
+                                       || pc->assign_ctxt == 
Op_K_getline_redir)
+                               && TOP()->numbr <= 0.0  /* top of stack has a 
number <= 0 */
+                       ) {
+                               /* getline returned EOF or error */
+
+                               break;
+                       }
+
+                       if (pc->opcode == Op_var_assign)
+                               pc->assign_var();
+                       else
+                               pc->field_assign();
+                       break;
+
+               case Op_concat:
+                       r = concat_exp(pc->expr_count, pc->concat_flag & 
CSUBSEP);
+                       PUSH(r);
+                       break;
+
+               case Op_K_case:
+                       if ((pc + 1)->match_exp) {
+                               /* match a constant regex against switch 
expression instead of $0. */
+
+                               m = POP();      /* regex */
+                               t2 = TOP_SCALAR();      /* switch expression */
+                               t2 = force_string(t2);
+                               rp = re_update(m);
+                               di = (research(rp, t2->stptr, 0, t2->stlen,
+                                                       avoid_dfa(m, t2->stptr, 
t2->stlen)) >= 0);
+                       } else {
+                               t1 = POP_SCALAR();      /* case value */
+                               t2 = TOP_SCALAR();      /* switch expression */
+                               di = (cmp_nodes(t2, t1) == 0);
+                               DEREF(t1);
+                       }
+
+                       if (di) {
+                               /* match found */
+
+                               t2 = POP_SCALAR();
+                               DEREF(t2);
+                               JUMPTO(pc->target_jmp);
+                       }
+                       break;
+
+               case Op_K_delete:
+                       t1 = POP_ARRAY();
+                       do_delete(t1, pc->expr_count);
+                       stack_adj(-pc->expr_count);
+                       break;
+
+               case Op_K_delete_loop:
+                       t1 = POP_ARRAY();
+                       lhs = POP_ADDRESS();    /* item */
+                       do_delete_loop(t1, lhs);
+                       break;
+
+               case Op_in_array:
+                       t1 = POP_ARRAY();
+                       t2 = mk_sub(pc->expr_count);
+                       di = (in_array(t1, t2) != NULL);
+                       DEREF(t2);
+                       PUSH(make_number((AWKNUM) di));
+                       break;
+
+               case Op_arrayfor_init:
+               {
+                       NODE **list = NULL;
+                       NODE *array, *sort_str;
+                       size_t num_elems = 0;
+                       static NODE *sorted_in = NULL;
+                       const char *how_to_sort = "@unsorted";
+
+                       /* get the array */
+                       array = POP_ARRAY();
+
+                       /* sanity: check if empty */
+                       if (array_empty(array))
+                               goto arrayfor;
+
+                       num_elems = array->table_size;
+
+                       if (sorted_in == NULL)          /* do this once */
+                               sorted_in = make_string("sorted_in", 9);
+
+                       sort_str = NULL;
+                       /*
+                        * If posix, or if there's no PROCINFO[],
+                        * there's no ["sorted_in"], so no sorting
+                        */
+                       if (! do_posix && PROCINFO_node != NULL)
+                               sort_str = in_array(PROCINFO_node, sorted_in);
+
+                       if (sort_str != NULL) {
+                               sort_str = force_string(sort_str);
+                               if (sort_str->stlen > 0)
+                                       how_to_sort = sort_str->stptr;
+                       }
+
+                       list = assoc_list(array, how_to_sort, SORTED_IN);
+
+arrayfor:
+                       getnode(r);
+                       r->type = Node_arrayfor;
+                       r->for_list = list;
+                       r->for_list_size = num_elems;           /* # of 
elements in list */
+                       r->cur_idx = -1;                        /* current 
index */
+                       r->for_array = array;           /* array */
+                       PUSH(r);
+
+                       if (num_elems == 0)
+                               JUMPTO(pc->target_jmp);   /* Op_arrayfor_final 
*/
+               }
+                       break;
+
+               case Op_arrayfor_incr:
+                       r = TOP();      /* Node_arrayfor */
+                       if (++r->cur_idx == r->for_list_size) {
+                               NODE *array;
+                               array = r->for_array;   /* actual array */
+                               if (do_lint && array->table_size != 
r->for_list_size)
+                                       lintwarn(_("for loop: array `%s' 
changed size from %ld to %ld during loop execution"),
+                                               array_vname(array), (long) 
r->for_list_size, (long) array->table_size);
+                               JUMPTO(pc->target_jmp); /* Op_arrayfor_final */
+                       }
+
+                       t1 = r->for_list[r->cur_idx];
+                       lhs = get_lhs(pc->array_var, FALSE);
+                       unref(*lhs);
+                       *lhs = dupnode(t1);
+                       break;
+
+               case Op_arrayfor_final:
+                       r = POP();
+                       assert(r->type == Node_arrayfor);
+                       free_arrayfor(r);
+                       break;
+
+               case Op_builtin:
+                       r = pc->builtin(pc->expr_count);
+                       PUSH(r);
+                       break;
+
+               case Op_ext_builtin:
+               {
+                       int arg_count = pc->expr_count;
+
+                       PUSH_CODE(pc);
+                       r = pc->builtin(arg_count);
+                       (void) POP_CODE();
+                       while (arg_count-- > 0) {
+                               t1 = POP();
+                               if (t1->type == Node_val)
+                                       DEREF(t1);
+                       }
+                       PUSH(r);
+               }
+                       break;
+
+               case Op_sub_builtin:    /* sub, gsub and gensub */
+                       r = do_sub(pc->expr_count, pc->sub_flags);
+                       PUSH(r);
+                       break;
+
+               case Op_K_print:
+                       do_print(pc->expr_count, pc->redir_type);
+                       break;
+
+               case Op_K_printf:
+                       do_printf(pc->expr_count, pc->redir_type);
+                       break;
+
+               case Op_K_print_rec:
+                       do_print_rec(pc->expr_count, pc->redir_type);
+                       break;
+
+               case Op_push_re:
+                       m = pc->memory;
+                       if (m->type == Node_dynregex) {
+                               r = POP_STRING();
+                               unref(m->re_exp);
+                               m->re_exp = r;
+                       }
+                       PUSH(m);
+                       break;
+                       
+               case Op_match_rec:
+                       m = pc->memory;
+                       t1 = *get_field(0, (Func_ptr *) 0);
+match_re:
+                       rp = re_update(m);
+                       /*
+                        * Any place where research() is called with a last 
parameter of
+                        * zero, we need to use the avoid_dfa test. This 
appears here and
+                        * in the code for Op_K_case.
+                        *
+                        * A new or improved dfa that distinguishes 
beginning/end of
+                        * string from beginning/end of line will allow us to 
get rid of
+                        * this hack.
+                        *
+                        * The avoid_dfa() function is in re.c; it is not very 
smart.
+                        */
+
+                       di = research(rp, t1->stptr, 0, t1->stlen,
+                                                               avoid_dfa(m, 
t1->stptr, t1->stlen));
+                       di = (di == -1) ^ (pc->opcode != Op_nomatch);
+                       if(pc->opcode != Op_match_rec) {
+                               decr_sp();
+                               DEREF(t1);
+                       }
+                       r = node_Boolean[di];
+                       UPREF(r);
+                       PUSH(r);
+                       break;
+
+               case Op_nomatch:
+                       /* fall through */
+               case Op_match:
+                       m = pc->memory;
+                       t1 = TOP_STRING();
+                       if (m->type == Node_dynregex) {
+                               unref(m->re_exp);
+                               m->re_exp = t1;
+                               decr_sp();
+                               t1 = TOP_STRING();
+                       }
+                       goto match_re;
+                       break;
+
+               case Op_indirect_func_call:
+               {
+                       int arg_count;
+
+                       f = NULL;
+                       arg_count = (pc + 1)->expr_count;
+                       t1 = PEEK(arg_count);   /* indirect var */
+                       assert(t1->type == Node_val);   /* @a[1](p) not allowed 
in grammar */
+                       t1 = force_string(t1);
+                       if (t1->stlen > 0) {
+                               /* retrieve function definition node */
+                               f = pc->func_body;
+                               if (f != NULL && STREQ(f->vname, t1->stptr)) {
+                                       /* indirect var hasn't been reassigned 
*/
+
+                                       goto func_call;
+                               }
+                               f = lookup(t1->stptr);
+                       }
+
+                       if (f == NULL || f->type != Node_func)
+                               fatal(_("function called indirectly through 
`%s' does not exist"),
+                                               pc->func_name); 
+                       pc->func_body = f;     /* save for next call */
+
+                       goto func_call;
+               }
+
+               case Op_func_call:
+                       /* retrieve function definition node */
+                       f = pc->func_body;
+                       if (f == NULL) {
+                               f = lookup(pc->func_name);
+                               if (f == NULL || (f->type != Node_func && 
f->type != Node_ext_func))
+                                       fatal(_("function `%s' not defined"), 
pc->func_name);
+                               pc->func_body = f;     /* save for next call */
+                       }
+
+                       if (f->type == Node_ext_func) {
+                               INSTRUCTION *bc;
+                               char *fname = pc->func_name;
+                               int arg_count = (pc + 1)->expr_count;
+
+                               bc = f->code_ptr;
+                               assert(bc->opcode == Op_symbol);
+                               pc->opcode = Op_ext_builtin;    /* self 
modifying code */
+                               pc->builtin = bc->builtin;
+                               pc->expr_count = arg_count;             /* 
actual argument count */
+                               (pc + 1)->func_name = fname;    /* name of the 
builtin */
+                               (pc + 1)->expr_count = bc->expr_count;  /* 
defined max # of arguments */
+                               ni = pc; 
+                               JUMPTO(ni);
+                       }
+
+func_call:
+                       ni = setup_frame(pc);
+                                               
+                       /* run the function instructions */
+                       JUMPTO(ni);             /* Op_func */
+
+               case Op_K_return:
+                       m = POP_SCALAR();       /* return value */
+
+                       ni = pop_fcall();
+       
+                       /* put the return value back on stack */
+                       PUSH(m);
+
+                       JUMPTO(ni);
+
+               case Op_K_getline_redir:
+                       if ((currule == BEGINFILE || currule == ENDFILE)
+                                       && pc->into_var == FALSE
+                                       && pc->redir_type == redirect_input)
+                               fatal(_("`getline' invalid inside `%s' rule"), 
ruletab[currule]);
+                       r = do_getline_redir(pc->into_var, pc->redir_type);
+                       PUSH(r);
+                       break;
+
+               case Op_K_getline:      /* no redirection */
+                       if (! currule || currule == BEGINFILE || currule == 
ENDFILE)
+                               fatal(_("non-redirected `getline' invalid 
inside `%s' rule"),
+                                               ruletab[currule]);
+
+                       do {
+                               int ret;
+                               ret = nextfile(& curfile, FALSE);
+                               if (ret <= 0)
+                                       r = do_getline(pc->into_var, curfile);
+                               else {
+
+                                       /* Save execution state so that we can 
return to it
+                                        * from Op_after_beginfile or 
Op_after_endfile.
+                                        */ 
+
+                                       push_exec_state(pc, currule, source, 
stack_ptr);
+
+                                       if (curfile == NULL)
+                                               JUMPTO((pc + 
1)->target_endfile);
+                                       else
+                                               JUMPTO((pc + 
1)->target_beginfile);
+                               }
+                       } while (r == NULL);    /* EOF */
+
+                       PUSH(r);
+                       break;
+
+               case Op_after_endfile:
+                       /* Find the execution state to return to */
+                       ni = pop_exec_state(& currule, & source, NULL);
+
+                       assert(ni->opcode == Op_newfile || ni->opcode == 
Op_K_getline);
+                       JUMPTO(ni);
+
+               case Op_after_beginfile:
+                       after_beginfile(& curfile);
+
+                       /* Find the execution state to return to */
+                       ni = pop_exec_state(& currule, & source, NULL);
+
+                       assert(ni->opcode == Op_newfile || ni->opcode == 
Op_K_getline);
+                       if (ni->opcode == Op_K_getline
+                                       || curfile == NULL      /* skipping 
directory argument */
+                       )
+                               JUMPTO(ni);
+
+                       break;  /* read a record, Op_get_record */
+
+               case Op_newfile:
+               {
+                       int ret;
+
+                       ret = nextfile(& curfile, FALSE);
+
+                       if (ret < 0)    /* end of input */
+                               JUMPTO(pc->target_jmp); /* end block or 
Op_atexit */
+
+                       if (ret == 0) /* read a record */
+                               JUMPTO((pc + 1)->target_get_record);
+
+                       /* ret > 0 */
+                       /* Save execution state for use in Op_after_beginfile 
or Op_after_endfile. */
+
+                       push_exec_state(pc, currule, source, stack_ptr);
+
+                       if (curfile == NULL)    /* EOF */
+                               JUMPTO(pc->target_endfile);
+                       /* else
+                               execute beginfile block */
+               }
+                       break;
+                       
+               case Op_get_record:             
+               {
+                       int errcode = 0;
+
+                       ni = pc->target_newfile;
+                       if (curfile == NULL) {
+                               /* from non-redirected getline, e.g.:
+                                *  {
+                                *              while (getline > 0) ;
+                                *  }
+                                */
+
+                               ni = ni->target_jmp;    /* end_block or 
Op_atexit */
+                               JUMPTO(ni);
+                       }
+
+                       if (inrec(curfile, & errcode) != 0) {
+                               if (errcode > 0 && (do_traditional || ! 
pc->has_endfile))
+                                       fatal(_("error reading input file `%s': 
%s"),
+                                               curfile->name, 
strerror(errcode));
+
+                               JUMPTO(ni);
+                       } /* else
+                               prog (rule) block */
+               }
+                       break;
+
+               case Op_K_nextfile:
+               {
+                       int ret;
+
+                       if (currule != Rule && currule != BEGINFILE)
+                               fatal(_("`nextfile' cannot be called from a 
`%s' rule"),
+                                       ruletab[currule]);
+
+                       ret = nextfile(& curfile, TRUE);        /* skip current 
file */
+
+                       if (currule == BEGINFILE) {
+                               long stack_size;
+
+                               ni = pop_exec_state(& currule, & source, & 
stack_size);
+
+                               assert(ni->opcode == Op_K_getline || ni->opcode 
== Op_newfile);
+
+                               /* pop stack returning to the state of 
Op_K_getline or Op_newfile. */
+                               unwind_stack(stack_size);
+
+                               if (ret == 0) {
+                                       /* There was an error opening the file;
+                                        * don't run ENDFILE block(s).
+                                        */
+
+                                       JUMPTO(ni);
+                               } else {
+                                       /* do run ENDFILE block(s) first. */
+                                       
+                                       /* Execution state to return to in 
Op_after_endfile. */
+                                       push_exec_state(ni, currule, source, 
stack_ptr);
+
+                                       JUMPTO(pc->target_endfile);
+                               }                               
+                       } /* else 
+                               Start over with the first rule. */
+
+                       /* empty the run-time stack to avoid memory leak */
+                       pop_stack();
+
+                       /* Push an execution state for Op_after_endfile to 
return to */
+                       push_exec_state(pc->target_newfile, currule, source, 
stack_ptr);
+
+                       JUMPTO(pc->target_endfile);
+               }
+                       break;
+
+               case Op_K_exit:
+                       /* exit not allowed in user-defined comparison 
functions for "sorted_in";
+                        * This is done so that END blocks aren't executed more 
than once.
+                        */
+                       if (! currule)
+                               fatal(_("`exit' cannot be called in the current 
context"));
+
+                       exiting = TRUE;
+                       POP_NUMBER(x1);
+                       exit_val = (int) x1;
+#ifdef VMS
+                       if (exit_val == 0)
+                               exit_val = EXIT_SUCCESS;
+                       else if (exit_val == 1)
+                               exit_val = EXIT_FAILURE;
+                       /* else
+                               just pass anything else on through */
+#endif
+
+                       if (currule == BEGINFILE || currule == ENDFILE) {
+
+                               /* Find the rule of the saved execution state 
(Op_K_getline/Op_newfile).
+                                * This is needed to prevent multiple execution 
of any END rules:
+                                *      gawk 'BEGINFILE { exit(1) } \
+                                *         END { while (getline > 0); }' in1 in2
+                                */
+
+                               (void) pop_exec_state(& currule, & source, 
NULL);
+                       }
+
+                       pop_stack();    /* empty stack, don't leak memory */
+
+                       /* Jump to either the first END block instruction
+                        * or to Op_atexit.
+                        */
+
+                       if (currule == END)
+                               ni = pc->target_atexit;
+                       else
+                               ni = pc->target_end;
+                       JUMPTO(ni);
+
+               case Op_K_next:
+                       if (currule != Rule)
+                               fatal(_("`next' cannot be called from a `%s' 
rule"), ruletab[currule]);
+
+                       pop_stack();
+                       JUMPTO(pc->target_jmp); /* Op_get_record, read next 
record */
+
+               case Op_pop:
+                       r = POP_SCALAR();
+                       DEREF(r);
+                       break;
+
+               case Op_line_range:
+                       if (pc->triggered)              /* evaluate right 
expression */
+                               JUMPTO(pc->target_jmp);
+                       /* else
+                               evaluate left expression */
+                       break;
+
+               case Op_cond_pair:
+               {
+                       int result;
+                       INSTRUCTION *ip;
+
+                       t1 = TOP_SCALAR();   /* from right hand side expression 
*/
+                       di = (eval_condition(t1) != 0);
+                       DEREF(t1);
+
+                       ip = pc->line_range;            /* Op_line_range */
+
+                       if (! ip->triggered && di) {
+                               /* not already triggered and left expression is 
TRUE */
+                               decr_sp();
+                               ip->triggered = TRUE;
+                               JUMPTO(ip->target_jmp); /* evaluate right 
expression */ 
+                       }
+
+                       result = ip->triggered || di;
+                       ip->triggered ^= di;          /* update triggered flag 
*/
+                       r = node_Boolean[result];      /* final value of 
condition pair */
+                       UPREF(r);
+                       REPLACE(r);
+                       JUMPTO(pc->target_jmp);
+               }
+
+               case Op_exec_count:
+                       if (do_profile)
+                               pc->exec_count++;
+                       break;
+
+               case Op_no_op:
+               case Op_K_do:
+               case Op_K_while:
+               case Op_K_for:
+               case Op_K_arrayfor:
+               case Op_K_switch:
+               case Op_K_default:
+               case Op_K_if:
+               case Op_K_else:
+               case Op_cond_exp:
+                       break;
+
+               default:
+                       fatal(_("Sorry, don't know how to interpret `%s'"), 
opcode2str(pc->opcode));
+               }
+
+               JUMPTO(pc->nexti);
+
+/*     } forever */
+
+       /* not reached */
+       return 0;
+
+#undef mk_sub
+#undef JUMPTO
+}
+
diff --git a/io.c b/io.c
index a2afeca..e8c6d87 100644
--- a/io.c
+++ b/io.c
@@ -2341,6 +2341,30 @@ init_awkpath(char *path)
 #undef INC_PATH
 }
 
+/* get_cwd -- get current working directory */
+
+static char *
+get_cwd ()
+{
+#define BSIZE  100
+       char *buf;
+       size_t bsize = BSIZE;
+
+       emalloc(buf, char *, bsize * sizeof(char), "get_cwd");
+       while (TRUE) {
+               if (getcwd(buf, bsize) == buf)
+                       return buf;
+               if (errno != ERANGE) {
+                       efree(buf);
+                       return NULL;
+               }
+               bsize *= 2;
+               erealloc(buf, char *, bsize * sizeof(char), "get_cwd");
+       }
+#undef BSIZE
+}
+
+
 /* do_find_source --- search $AWKPATH for file, return NULL if not found */ 
 
 static char *
@@ -2362,10 +2386,16 @@ do_find_source(const char *src, struct stat *stb, int 
*errcode)
                return NULL;
        }
 
-       /* try current directory before path search */
+       /* try current directory before $AWKPATH search */
        if (stat(src, stb) == 0) {
-               emalloc(path, char *, strlen(src) + 1, "do_find_source");
-               strcpy(path, src);
+               path = get_cwd();
+               if (path == NULL) {
+                       *errcode = errno;
+                       return NULL;
+               }
+               erealloc(path, char *, strlen(path) + strlen(src) + 2, 
"do_find_source");
+               strcat(path, "/");
+               strcat(path, src);
                return path;
        }
 
@@ -2375,6 +2405,7 @@ do_find_source(const char *src, struct stat *stb, int 
*errcode)
        emalloc(path, char *, max_pathlen + strlen(src) + 1, "do_find_source"); 
        for (i = 0; awkpath[i] != NULL; i++) {
                if (STREQ(awkpath[i], "./") || STREQ(awkpath[i], ".")) {
+                       /* FIXME: already tried CWD above; Why do it again ? */
                        *path = '\0';
                } else
                        strcpy(path, awkpath[i]);
@@ -2392,7 +2423,7 @@ do_find_source(const char *src, struct stat *stb, int 
*errcode)
 /* find_source --- find source file with default file extension handling */ 
 
 char *
-find_source(const char *src, struct stat *stb, int *errcode)
+find_source(const char *src, struct stat *stb, int *errcode, int is_extlib)
 {
        char *path;
 
@@ -2401,10 +2432,36 @@ find_source(const char *src, struct stat *stb, int 
*errcode)
                return NULL;
        path = do_find_source(src, stb, errcode);
 
+       if (path == NULL && is_extlib) {
+               char *file_ext;
+               int save_errno;
+               size_t src_len;
+               size_t suffix_len;
+
+#define EXTLIB_SUFFIX  ".so"
+               src_len = strlen(src);
+               suffix_len = strlen(EXTLIB_SUFFIX);
+
+               /* check if already has the SUFFIX */
+               if (src_len >= suffix_len && strcmp(& src[src_len - 
suffix_len], EXTLIB_SUFFIX) == 0)
+                       return NULL;
+
+               /* append EXTLIB_SUFFIX and try again */
+               save_errno = errno;
+               emalloc(file_ext, char *, src_len + suffix_len + 1, 
"find_source");
+               sprintf(file_ext, "%s%s", src, EXTLIB_SUFFIX);
+               path = do_find_source(file_ext, stb, errcode);
+               efree(file_ext);
+               if (path == NULL)
+                       errno = save_errno;
+               return path;
+#undef EXTLIB_SUFFIX
+       }
+
 #ifdef DEFAULT_FILETYPE
        if (! do_traditional && path == NULL) {
                char *file_awk;
-               int save = errno;
+               int save_errno = errno;
 #ifdef VMS
                int vms_save = vaxc$errno;
 #endif
@@ -2416,7 +2473,7 @@ find_source(const char *src, struct stat *stb, int 
*errcode)
                path = do_find_source(file_awk, stb, errcode);
                efree(file_awk);
                if (path == NULL) {
-                       errno = save;
+                       errno = save_errno;
 #ifdef VMS
                        vaxc$errno = vms_save;
 #endif
@@ -2427,6 +2484,7 @@ find_source(const char *src, struct stat *stb, int 
*errcode)
        return path;
 }
 
+
 /* srcopen --- open source file */
 
 int
diff --git a/main.c b/main.c
index 6b24a80..f8b5d81 100644
--- a/main.c
+++ b/main.c
@@ -58,6 +58,9 @@ static void init_groupset(void);
 
 static void save_argv(int, char **);
 
+extern int debug_prog(INSTRUCTION *pc); /* debug.c */
+
+
 /* These nodes store all the special variables AWK uses */
 NODE *ARGC_node, *ARGIND_node, *ARGV_node, *BINMODE_node, *CONVFMT_node;
 NODE *ENVIRON_node, *ERRNO_node, *FIELDWIDTHS_node, *FILENAME_node;
@@ -130,7 +133,7 @@ static int disallow_var_assigns = FALSE;    /* true for 
--exec */
 static void add_preassign(enum assign_type type, char *val);
 
 int do_flags = FALSE;
-int do_optimize = TRUE;                                /* apply default 
optimizations */
+int do_optimize = TRUE;                        /* apply default optimizations 
*/
 static int do_nostalgia = FALSE;       /* provide a blast from the past */
 static int do_binary = FALSE;          /* hands off my data! */
 
@@ -140,7 +143,7 @@ int use_lc_numeric = FALSE; /* obey locale for decimal 
point */
 int gawk_mb_cur_max;           /* MB_CUR_MAX value, see comment in main() */
 #endif
 
-FILE *output_fp;               /* default output for debugger */
+FILE *output_fp;               /* default gawk output, can be redirected in 
the debugger */
 int output_is_tty = FALSE;     /* control flushing of output */
 
 /* default format for strftime(), available via PROCINFO */
@@ -155,26 +158,24 @@ int ngroups;                      /* size of said set */
 
 void (*lintfunc)(const char *mesg, ...) = warning;
 
-/*
- * Note: reserve -D for future use, to merge dgawk into gawk.
- * Note: reserve -l for future use, for xgawk's -l option.
- */
 static const struct option optab[] = {
        { "traditional",        no_argument,            NULL,   'c' },
        { "lint",               optional_argument,      NULL,           'L' },
        { "lint-old",           no_argument,            NULL,   't' },
        { "optimize",           no_argument,            NULL,   'O' },
        { "posix",              no_argument,            NULL,   'P' },
-       { "command",            required_argument,      NULL,           'R' },
        { "nostalgia",          no_argument,            & do_nostalgia, 1 },
        { "gen-pot",            no_argument,            NULL,   'g' },
        { "non-decimal-data",   no_argument,            NULL, 'n' },
+       { "pretty-print",       optional_argument,      NULL,           'o' },
        { "profile",            optional_argument,      NULL,           'p' },
+       { "debug",              optional_argument,      NULL,           'D' },
        { "copyright",          no_argument,            NULL,           'C' },
        { "field-separator",    required_argument,      NULL,           'F' },
        { "file",               required_argument,      NULL,           'f' },
        { "re-interval",        no_argument,            NULL,   'r' },
        { "source",             required_argument,      NULL,           'e' },
+       { "load",               required_argument,      NULL,           'l' },
        { "dump-variables",     optional_argument,      NULL,           'd' },
        { "assign",             required_argument,      NULL,           'v' },
        { "version",            no_argument,            NULL,           'V' },
@@ -197,16 +198,17 @@ main(int argc, char **argv)
 {
        /*
         * The + on the front tells GNU getopt not to rearrange argv.
-        * Note: reserve -D for future use, to merge dgawk into gawk.
         * Note: reserve -l for future use, for xgawk's -l option.
         */
-       const char *optlist = "+F:f:v:W;m:bcCd::e:E:gh:L:nNOp::PrR:StVY";
+       const char *optlist = "+F:f:v:W;m:bcCd::D::e:E:gh:l:L:nNo::Op::PrStVY";
        int stopped_early = FALSE;
        int old_optind;
        int i;
        int c;
        char *scan, *src;
        char *extra_stack;
+       int have_srcfile = FALSE;
+       SRCFILE *s;
 
        /* do these checks early */
        if (getenv("TIDYMEM") != NULL)
@@ -369,6 +371,12 @@ main(int argc, char **argv)
                                varfile = optarg;
                        break;
 
+               case 'D':
+                       do_flags |= DO_DEBUG;
+                       if (optarg != NULL && optarg[0] != '\0')
+                               command_file = optarg;
+                       break;
+
                case 'e':
                        if (optarg[0] == '\0')
                                warning(_("empty argument to `-e/--source' 
ignored"));
@@ -385,6 +393,10 @@ main(int argc, char **argv)
                        usage(EXIT_SUCCESS, stdout);
                        break;
 
+               case 'l':
+                       (void) add_srcfile(SRC_EXTLIB, optarg, srcfiles, NULL, 
NULL);
+                       break;
+
                case 'L':
 #ifndef NO_LINT
                        do_flags |= DO_LINT_ALL;
@@ -420,7 +432,10 @@ main(int argc, char **argv)
                        break;
 
                case 'p':
-                       do_flags |= DO_PROFILING;
+                       do_flags |= DO_PROFILE;
+                       /* fall through */
+               case 'o':
+                       do_flags |= DO_PRETTY_PRINT;
                        if (optarg != NULL)
                                set_prof_file(optarg);
                        else
@@ -457,20 +472,13 @@ main(int argc, char **argv)
                        break;
 
                case 'Y':
-               case 'R':
 #if defined(YYDEBUG) || defined(GAWKDEBUG)
                        if (c == 'Y') {
                                yydebug = 2;
                                break;
                        }
 #endif
-                       if (c == 'R' &&  which_gawk == exe_debugging) {
-                               if (optarg[0] != '\0')
-                                       command_file = optarg;
-                               break;
-                       }
-                       /* if not debugging or dgawk, fall through */
-
+                       /* if not debugging, fall through */
                case '?':
                default:
                        /*
@@ -550,13 +558,6 @@ out:
        }
 #endif
 
-       /*
-        * Force profiling if this is pgawk.
-        * Don't bother if the command line already set profiling up.
-        */
-       if (! do_profiling)
-               init_profiling(& do_flags, DEFAULT_PROFILE);
-
        /* load group set */
        init_groupset();
 
@@ -572,7 +573,7 @@ out:
         */
        resetup();
 
-       (void) grow_stack();
+       init_interpret();
 
        /* Set up the special variables */
        init_vars();
@@ -607,8 +608,17 @@ out:
 #endif
        if (os_isatty(fileno(stdout)))
                output_is_tty = TRUE;
+
+       /* load extension libs */
+        for (s = srcfiles->next; s != srcfiles; s = s->next) {
+                if (s->stype == SRC_EXTLIB)
+                       (void) load_ext(s->fullpath, "dlload", NULL);
+               else
+                       have_srcfile++;
+        }
+
        /* No -f or --source options, use next arg */
-       if (srcfiles->next == srcfiles) {
+       if (! have_srcfile) {
                if (optind > argc - 1 || stopped_early) /* no args left or no 
program */
                        usage(EXIT_FAILURE, stderr);
                (void) add_srcfile(SRC_CMDLINE, argv[optind], srcfiles, NULL, 
NULL);
@@ -628,7 +638,7 @@ out:
        setlocale(LC_NUMERIC, "C");
 #endif
        /* Read in the program */
-       if (parse_program(&code_block) != 0)
+       if (parse_program(& code_block) != 0)
                exit(EXIT_FAILURE);
        
        if (do_intl)
@@ -640,7 +650,8 @@ out:
        if (do_lint && code_block->nexti->opcode == Op_atexit)
                lintwarn(_("no program text at all!"));
 
-       init_profiling_signals();
+       if (do_profile)
+               init_profiling_signals();
 
 #if defined(LC_NUMERIC)
        /*
@@ -663,9 +674,12 @@ out:
 #endif
 
        output_fp = stdout;
-       interpret(code_block);
+       if (do_debug)
+               debug_prog(code_block);
+       else
+               interpret(code_block);
 
-       if (do_profiling) {
+       if (do_pretty_print) {
                dump_prog(code_block);
                dump_funcs();
        }
@@ -718,8 +732,7 @@ usage(int exitval, FILE *fp)
        /* Not factoring out common stuff makes it easier to translate. */
        fprintf(fp, _("Usage: %s [POSIX or GNU style options] -f progfile [--] 
file ...\n"),
                myname);
-       if (which_gawk != exe_debugging)
-               fprintf(fp, _("Usage: %s [POSIX or GNU style options] [--] 
%cprogram%c file ...\n"),
+       fprintf(fp, _("Usage: %s [POSIX or GNU style options] [--] %cprogram%c 
file ...\n"),
                        myname, quote, quote);
 
        /* GNU long options info. This is too many options. */
@@ -733,19 +746,20 @@ usage(int exitval, FILE *fp)
        fputs(_("\t-c\t\t\t--traditional\n"), fp);
        fputs(_("\t-C\t\t\t--copyright\n"), fp);
        fputs(_("\t-d[file]\t\t--dump-variables[=file]\n"), fp);
+       fputs(_("\t-D[file]\t\t--debug[=file]\n"), fp);
        fputs(_("\t-e 'program-text'\t--source='program-text'\n"), fp);
        fputs(_("\t-E file\t\t\t--exec=file\n"), fp);
        fputs(_("\t-g\t\t\t--gen-pot\n"), fp);
        fputs(_("\t-h\t\t\t--help\n"), fp);
+       fputs(_("\t-l library\t\t--load=library\n"), fp);
        fputs(_("\t-L [fatal]\t\t--lint[=fatal]\n"), fp);
        fputs(_("\t-n\t\t\t--non-decimal-data\n"), fp);
        fputs(_("\t-N\t\t\t--use-lc-numeric\n"), fp);
+       fputs(_("\t-o[file]\t\t--pretty-print[=file]\n"), fp);
        fputs(_("\t-O\t\t\t--optimize\n"), fp);
        fputs(_("\t-p[file]\t\t--profile[=file]\n"), fp);
        fputs(_("\t-P\t\t\t--posix\n"), fp);
        fputs(_("\t-r\t\t\t--re-interval\n"), fp);
-       if (which_gawk == exe_debugging)
-               fputs(_("\t-R file\t\t\t--command=file\n"), fp);
        fputs(_("\t-S\t\t\t--sandbox\n"), fp);
        fputs(_("\t-t\t\t\t--lint-old\n"), fp);
        fputs(_("\t-V\t\t\t--version\n"), fp);
diff --git a/profile.c b/profile.c
index c721180..6d9db06 100644
--- a/profile.c
+++ b/profile.c
@@ -43,10 +43,9 @@ const char *redir2str(int redirtype);
 #define DONT_FREE 1
 #define CAN_FREE  2
 
-#ifdef PROFILING
+
 static RETSIGTYPE dump_and_exit(int signum) ATTRIBUTE_NORETURN;
 static RETSIGTYPE just_dump(int signum);
-#endif
 
 /* pretty printing related functions and variables */
 
@@ -59,20 +58,7 @@ static long indent_level = 0;
 
 #define SPACEOVER      0
 
-/* init_profiling --- do needed initializations, see also main.c */
-
-void
-init_profiling(int *flag ATTRIBUTE_UNUSED, const char *def_file 
ATTRIBUTE_UNUSED)
-{
-#ifdef PROFILING
-       if (*flag == FALSE) {
-               *flag |= DO_PROFILING;
-               set_prof_file(def_file);
-       }
-#endif
-}
-
-/* set_prof_file --- set the output file for profiling */
+/* set_prof_file --- set the output file for profiling or pretty-printing */
 
 void
 set_prof_file(const char *file)
@@ -87,12 +73,11 @@ set_prof_file(const char *file)
        }
 }
 
-/* init_profiling_signals --- set up signal handling for pgawk */
+/* init_profiling_signals --- set up signal handling for gawk --profile */
 
 void
 init_profiling_signals()
 {
-#ifdef PROFILING
 #ifdef __DJGPP__
        signal(SIGINT, dump_and_exit);
        signal(SIGQUIT, just_dump);
@@ -104,7 +89,6 @@ init_profiling_signals()
        signal(SIGUSR1, just_dump);
 #endif
 #endif /* !__DJGPP__ */
-#endif /* PROFILING */
 }
 
 /* indent --- print out enough tabs */
@@ -214,10 +198,10 @@ pprint(INSTRUCTION *startp, INSTRUCTION *endp, int 
in_for_header)
                                        fprintf(prof_fp, "%s {", t1->pp_str);
                                        pp_free(t1);
                                        ip = (pc + 1)->firsti;
-#ifdef PROFILING
-                                       if (ip->exec_count > 0)
+
+                                       if (do_profile && ip->exec_count > 0)
                                                fprintf(prof_fp, " # %ld", 
ip->exec_count);
-#endif
+
                                        fprintf(prof_fp, "\n");
                                } else {
                                        fprintf(prof_fp, "{\n");
@@ -917,7 +901,7 @@ pp_string_fp(Func_print print_func, FILE *fp, const char 
*in_str,
        efree(s);
 }
 
-#ifdef PROFILING
+
 /* just_dump --- dump the profile and function stack and keep going */
 
 static RETSIGTYPE
@@ -941,7 +925,6 @@ dump_and_exit(int signum)
        exit(EXIT_FAILURE);
 }
 
-#endif
 
 /* dump_prog --- dump the program */
 
diff --git a/str_array.c b/str_array.c
index 8fb6ba8..be431e5 100644
--- a/str_array.c
+++ b/str_array.c
@@ -191,7 +191,8 @@ str_exists(NODE *symbol, NODE *subs)
        unsigned long hash1;
        size_t code1;
 
-       assert(symbol->table_size > 0);
+       if (symbol->table_size == 0)
+               return NULL;
 
        subs = force_string(subs);
        hash1 = hash(subs->stptr, subs->stlen, (unsigned long) 
symbol->array_size, & code1);
@@ -242,7 +243,8 @@ str_remove(NODE *symbol, NODE *subs)
        NODE *s2;
        size_t s1_len;
 
-       assert(symbol->table_size > 0);
+       if (symbol->table_size == 0)
+               return NULL;
 
        s2 = force_string(subs);
        hash1 = hash(s2->stptr, s2->stlen, (unsigned long) symbol->array_size, 
NULL);
@@ -358,7 +360,8 @@ str_list(NODE *symbol, NODE *t)
        unsigned long num_elems, list_size, i, k = 0;
        int elem_size = 1;
 
-       assert(symbol->table_size > 0);
+       if (symbol->table_size == 0)
+               return NULL;
 
        if ((t->flags & (AINDEX|AVALUE)) == (AINDEX|AVALUE))
                elem_size = 2;
diff --git a/test/ChangeLog b/test/ChangeLog
index 711d8b2..c16e5ec 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,7 @@
+2011-12-26         John Haque      <address@hidden>
+
+       * badargs.ok: Adjust for new and changed command line options.
+
 2011-12-26         Arnold D. Robbins     <address@hidden>
 
        * Makefile.am (rri1): New test.
diff --git a/test/Makefile.am b/test/Makefile.am
index 1bf4456..943dbd9 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1407,19 +1407,19 @@ dumpvars::
 
 profile1:
        @echo $@
-       @$(AWK) address@hidden -f $(srcdir)/xref.awk $(srcdir)/dtdgport.awk > 
address@hidden
+       @$(AWK) address@hidden -f $(srcdir)/xref.awk $(srcdir)/dtdgport.awk > 
address@hidden
        @$(AWK) -f address@hidden $(srcdir)/dtdgport.awk > address@hidden ; rm 
address@hidden
        @cmp address@hidden address@hidden && rm address@hidden || echo EXIT 
CODE: $$? >>_$@
 
 profile2:
        @echo $@
-       @$(PGAWK) address@hidden -v sortcmd=sort -f $(srcdir)/xref.awk 
$(srcdir)/dtdgport.awk > /dev/null
+       @$(AWK) address@hidden -v sortcmd=sort -f $(srcdir)/xref.awk 
$(srcdir)/dtdgport.awk > /dev/null
        @sed 1,2d < address@hidden > _$@; rm address@hidden
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
 
 profile3:
        @echo $@
-       @$(PGAWK) address@hidden -f $(srcdir)/address@hidden > /dev/null
+       @$(AWK) address@hidden -f $(srcdir)/address@hidden > /dev/null
        @sed 1,2d < address@hidden > _$@; rm address@hidden
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
 
diff --git a/test/Makefile.in b/test/Makefile.in
index 6eaeb72..a389929 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1757,19 +1757,19 @@ dumpvars::
 
 profile1:
        @echo $@
-       @$(AWK) address@hidden -f $(srcdir)/xref.awk $(srcdir)/dtdgport.awk > 
address@hidden
+       @$(AWK) address@hidden -f $(srcdir)/xref.awk $(srcdir)/dtdgport.awk > 
address@hidden
        @$(AWK) -f address@hidden $(srcdir)/dtdgport.awk > address@hidden ; rm 
address@hidden
        @cmp address@hidden address@hidden && rm address@hidden || echo EXIT 
CODE: $$? >>_$@
 
 profile2:
        @echo $@
-       @$(PGAWK) address@hidden -v sortcmd=sort -f $(srcdir)/xref.awk 
$(srcdir)/dtdgport.awk > /dev/null
+       @$(AWK) address@hidden -v sortcmd=sort -f $(srcdir)/xref.awk 
$(srcdir)/dtdgport.awk > /dev/null
        @sed 1,2d < address@hidden > _$@; rm address@hidden
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
 
 profile3:
        @echo $@
-       @$(PGAWK) address@hidden -f $(srcdir)/address@hidden > /dev/null
+       @$(AWK) address@hidden -f $(srcdir)/address@hidden > /dev/null
        @sed 1,2d < address@hidden > _$@; rm address@hidden
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
 
diff --git a/test/badargs.ok b/test/badargs.ok
index 66e67b0..cb14016 100644
--- a/test/badargs.ok
+++ b/test/badargs.ok
@@ -10,13 +10,16 @@ Short options:              GNU long options: (extensions)
        -c                      --traditional
        -C                      --copyright
        -d[file]                --dump-variables[=file]
+       -D[file]                --debug[=file]
        -e 'program-text'       --source='program-text'
        -E file                 --exec=file
        -g                      --gen-pot
        -h                      --help
+       -l library              --load=library
        -L [fatal]              --lint[=fatal]
        -n                      --non-decimal-data
        -N                      --use-lc-numeric
+       -o[file]                --pretty-print[=file]
        -O                      --optimize
        -p[file]                --profile[=file]
        -P                      --posix

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=14828f8fd6f90f711d832f2c4d7120db4bef3770

commit 14828f8fd6f90f711d832f2c4d7120db4bef3770
Merge: 0130721 a32faf6
Author: Arnold D. Robbins <address@hidden>
Date:   Mon Dec 26 22:55:35 2011 +0200

    Merge branch 'gawk-4.0-stable'

diff --cc awkgram.c
index 298e3a0,7a06667..32a4b66
--- a/awkgram.c
+++ b/awkgram.c
@@@ -2038,8 -2065,8 +2038,8 @@@ yyreduce
      {
          case 3:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 221 "awkgram.y"
 +#line 194 "awkgram.y"
      {
                rule = 0;
                yyerrok;
@@@ -2048,8 -2075,8 +2048,8 @@@
  
    case 5:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 227 "awkgram.y"
 +#line 200 "awkgram.y"
      {
                next_sourcefile();
          }
@@@ -2057,8 -2084,8 +2057,8 @@@
  
    case 6:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 231 "awkgram.y"
 +#line 204 "awkgram.y"
      {
                rule = 0;
                /*
@@@ -2071,8 -2098,8 +2071,8 @@@
  
    case 7:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 243 "awkgram.y"
 +#line 216 "awkgram.y"
      {
                (void) append_rule((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
@@@ -2080,8 -2107,8 +2080,8 @@@
  
    case 8:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 247 "awkgram.y"
 +#line 220 "awkgram.y"
      {
                if (rule != Rule) {
                        msg(_("%s blocks must have an action part"), 
ruletab[rule]);
@@@ -2096,19 -2123,21 +2096,19 @@@
  
    case 9:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 258 "awkgram.y"
 +#line 231 "awkgram.y"
      {
 -              can_return = FALSE;
 -              if ((yyvsp[(1) - (2)]) && func_install((yyvsp[(1) - (2)]), 
(yyvsp[(2) - (2)])) < 0)
 -                      YYABORT;
 -              func_params = NULL;
 +              in_function = NULL;
 +              (void) mk_function((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
                yyerrok;
          }
      break;
  
    case 10:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 266 "awkgram.y"
 +#line 237 "awkgram.y"
      {
                want_source = FALSE;
                yyerrok;
@@@ -2117,8 -2146,8 +2117,8 @@@
  
    case 11:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 274 "awkgram.y"
 +#line 245 "awkgram.y"
      {
                if (include_source((yyvsp[(1) - (1)])) < 0)
                        YYABORT;
@@@ -2130,36 -2159,36 +2130,36 @@@
  
    case 12:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 282 "awkgram.y"
 +#line 253 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
    case 13:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 284 "awkgram.y"
 +#line 255 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
    case 14:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 289 "awkgram.y"
 +#line 260 "awkgram.y"
      { (yyval) = NULL; rule = Rule; }
      break;
  
    case 15:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 291 "awkgram.y"
 +#line 262 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); rule = Rule; }
      break;
  
    case 16:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 293 "awkgram.y"
 +#line 264 "awkgram.y"
      {
                INSTRUCTION *tp;
  
@@@ -2189,8 -2218,8 +2189,8 @@@
  
    case 17:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 319 "awkgram.y"
 +#line 290 "awkgram.y"
      {
                static int begin_seen = 0;
                if (do_lint_old && ++begin_seen == 2)
@@@ -2205,8 -2234,8 +2205,8 @@@
  
    case 18:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 330 "awkgram.y"
 +#line 301 "awkgram.y"
      {
                static int end_seen = 0;
                if (do_lint_old && ++end_seen == 2)
@@@ -2221,8 -2250,8 +2221,8 @@@
  
    case 19:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 341 "awkgram.y"
 +#line 312 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->in_rule = rule = BEGINFILE;
                (yyvsp[(1) - (1)])->source_file = source;
@@@ -2232,8 -2261,8 +2232,8 @@@
  
    case 20:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 347 "awkgram.y"
 +#line 318 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->in_rule = rule = ENDFILE;
                (yyvsp[(1) - (1)])->source_file = source;
@@@ -2243,8 -2272,8 +2243,8 @@@
  
    case 21:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 356 "awkgram.y"
 +#line 327 "awkgram.y"
      {
                if ((yyvsp[(2) - (5)]) == NULL)
                        (yyval) = list_create(instruction(Op_no_op));
@@@ -2255,63 -2284,84 +2255,63 @@@
  
    case 22:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 366 "awkgram.y"
 +#line 337 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 23:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 368 "awkgram.y"
 +#line 339 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 24:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 370 "awkgram.y"
 +#line 341 "awkgram.y"
      {
                yyerror(_("`%s' is a built-in function, it cannot be 
redefined"),
 -                      tokstart);
 -              (yyvsp[(1) - (1)])->opcode = Op_symbol; /* Op_symbol instead of 
Op_token so that
 -                                       * free_bc_internal does not try to 
free it
 -                                       */
 -              (yyvsp[(1) - (1)])->lextok = builtin_func;
 -              (yyval) = (yyvsp[(1) - (1)]);
 -              /* yyerrok; */
 +                                      tokstart);
 +              YYABORT;
          }
      break;
  
    case 25:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 381 "awkgram.y"
 +#line 347 "awkgram.y"
      { (yyval) = (yyvsp[(2) - (2)]); }
      break;
  
    case 28:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 391 "awkgram.y"
 +#line 357 "awkgram.y"
      {
 -              param_counter = 0;
 -              func_params = NULL;
 +              (yyvsp[(1) - (6)])->source_file = source;
 +              if (install_function((yyvsp[(2) - (6)])->lextok, (yyvsp[(1) - 
(6)]), (yyvsp[(4) - (6)])) < 0)
 +                      YYABORT;
 +              in_function = (yyvsp[(2) - (6)])->lextok;
 +              (yyvsp[(2) - (6)])->lextok = NULL;
 +              bcfree((yyvsp[(2) - (6)]));
 +              /* $4 already free'd in install_function */
 +              (yyval) = (yyvsp[(1) - (6)]);
          }
      break;
  
    case 29:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 396 "awkgram.y"
 -    {
 -                      NODE *t;
 -
 -                      (yyvsp[(1) - (7)])->source_file = source;
 -                      t = make_param((yyvsp[(3) - (7)])->lextok);
 -                      (yyvsp[(3) - (7)])->lextok = NULL;
 -                      bcfree((yyvsp[(3) - (7)]));
 -                      t->flags |= FUNC;
 -                      t->rnode = func_params;
 -                      func_params = t;
 -                      (yyval) = (yyvsp[(1) - (7)]);
 -                      can_return = TRUE;
 -                      /* check for duplicate parameter names */
 -                      if (dup_parms((yyvsp[(1) - (7)]), t))
 -                              errcount++;
 -              }
 -    break;
 -
 -  case 30:
 -
 -/* Line 1806 of yacc.c  */
 -#line 420 "awkgram.y"
 +#line 375 "awkgram.y"
      { ++want_regexp; }
      break;
  
 -  case 31:
 +  case 30:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 422 "awkgram.y"
 +#line 377 "awkgram.y"
      {
                  NODE *n, *exp;
                  char *re;
@@@ -2342,24 -2391,24 +2342,24 @@@
                }
      break;
  
 -  case 32:
 +  case 31:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 453 "awkgram.y"
 +#line 409 "awkgram.y"
      { bcfree((yyvsp[(1) - (1)])); }
      break;
  
 -  case 34:
 +  case 33:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 459 "awkgram.y"
 +#line 415 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 35:
 +  case 34:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 461 "awkgram.y"
 +#line 417 "awkgram.y"
      {
                if ((yyvsp[(2) - (2)]) == NULL)
                        (yyval) = (yyvsp[(1) - (2)]);
@@@ -2374,31 -2423,31 +2374,31 @@@
          }
      break;
  
 -  case 36:
 +  case 35:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 474 "awkgram.y"
 +#line 430 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 39:
 +  case 38:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 484 "awkgram.y"
 +#line 440 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 40:
 +  case 39:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 486 "awkgram.y"
 +#line 442 "awkgram.y"
      { (yyval) = (yyvsp[(2) - (3)]); }
      break;
  
 -  case 41:
 +  case 40:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 488 "awkgram.y"
 +#line 444 "awkgram.y"
      {
                if (do_profiling)
                        (yyval) = list_prepend((yyvsp[(1) - (1)]), 
instruction(Op_exec_count));
@@@ -2407,10 -2456,10 +2407,10 @@@
          }
      break;
  
 -  case 42:
 +  case 41:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 495 "awkgram.y"
 +#line 451 "awkgram.y"
      {
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
                INSTRUCTION *ip, *nextc, *tbreak;
@@@ -2502,10 -2551,10 +2502,10 @@@
          }
      break;
  
 -  case 43:
 +  case 42:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 585 "awkgram.y"
 +#line 541 "awkgram.y"
      { 
                /*
                 *    -----------------
@@@ -2549,10 -2598,10 +2549,10 @@@
          }
      break;
  
 -  case 44:
 +  case 43:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 627 "awkgram.y"
 +#line 583 "awkgram.y"
      {
                /*
                 *    -----------------
@@@ -2596,10 -2645,10 +2596,10 @@@
          }
      break;
  
 -  case 45:
 +  case 44:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 669 "awkgram.y"
 +#line 625 "awkgram.y"
      {
                INSTRUCTION *ip;
                char *var_name = (yyvsp[(3) - (8)])->lextok;
@@@ -2714,10 -2763,10 +2714,10 @@@ regular_loop
          }
      break;
  
 -  case 46:
 +  case 45:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 782 "awkgram.y"
 +#line 738 "awkgram.y"
      {
                (yyval) = mk_for_loop((yyvsp[(1) - (12)]), (yyvsp[(3) - (12)]), 
(yyvsp[(6) - (12)]), (yyvsp[(9) - (12)]), (yyvsp[(12) - (12)]));
  
@@@ -2726,10 -2775,10 +2726,10 @@@
          }
      break;
  
 -  case 47:
 +  case 46:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 789 "awkgram.y"
 +#line 745 "awkgram.y"
      {
                (yyval) = mk_for_loop((yyvsp[(1) - (11)]), (yyvsp[(3) - (11)]), 
(INSTRUCTION *) NULL, (yyvsp[(8) - (11)]), (yyvsp[(11) - (11)]));
  
@@@ -2738,10 -2787,10 +2738,10 @@@
          }
      break;
  
 -  case 48:
 +  case 47:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 796 "awkgram.y"
 +#line 752 "awkgram.y"
      {
                if (do_profiling)
                        (yyval) = list_prepend((yyvsp[(1) - (1)]), 
instruction(Op_exec_count));
@@@ -2750,10 -2799,10 +2750,10 @@@
          }
      break;
  
 -  case 49:
 +  case 48:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 806 "awkgram.y"
 +#line 762 "awkgram.y"
      { 
                if (! break_allowed)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@@ -2764,10 -2813,10 +2764,10 @@@
          }
      break;
  
 -  case 50:
 +  case 49:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 815 "awkgram.y"
 +#line 771 "awkgram.y"
      {
                if (! continue_allowed)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@@ -2778,10 -2827,10 +2778,10 @@@
          }
      break;
  
 -  case 51:
 +  case 50:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 824 "awkgram.y"
 +#line 780 "awkgram.y"
      {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@@ -2792,10 -2841,10 +2792,10 @@@
          }
      break;
  
 -  case 52:
 +  case 51:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 833 "awkgram.y"
 +#line 789 "awkgram.y"
      {
                if (do_traditional)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@@ -2812,10 -2861,10 +2812,10 @@@
          }
      break;
  
 -  case 53:
 +  case 52:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 848 "awkgram.y"
 +#line 804 "awkgram.y"
      {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time. 
@@@ -2832,20 -2881,20 +2832,20 @@@
          }
      break;
  
 -  case 54:
 +  case 53:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 863 "awkgram.y"
 +#line 819 "awkgram.y"
      {
 -              if (! can_return)
 +              if (! in_function)
                        yyerror(_("`return' used outside function context"));
          }
      break;
  
 -  case 55:
 +  case 54:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 866 "awkgram.y"
 +#line 822 "awkgram.y"
      {
                if ((yyvsp[(3) - (4)]) == NULL) {
                        (yyval) = list_create((yyvsp[(1) - (4)]));
@@@ -2868,17 -2905,17 +2868,17 @@@
          }
      break;
  
 -  case 57:
 +  case 56:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 886 "awkgram.y"
 +#line 854 "awkgram.y"
      { in_print = TRUE; in_parens = 0; }
      break;
  
 -  case 58:
 +  case 57:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 887 "awkgram.y"
 +#line 855 "awkgram.y"
      {
                /*
                 * Optimization: plain `print' has no expression list, so $3 is 
null.
@@@ -2973,17 -3012,17 +2973,17 @@@
          }
      break;
  
 -  case 59:
 +  case 58:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 982 "awkgram.y"
 +#line 948 "awkgram.y"
      { sub_counter = 0; }
      break;
  
 -  case 60:
 +  case 59:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 983 "awkgram.y"
 +#line 949 "awkgram.y"
      {
                char *arr = (yyvsp[(2) - (4)])->lextok;
  
@@@ -3010,10 -3049,10 +3010,10 @@@
          }
      break;
  
 -  case 61:
 +  case 60:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1012 "awkgram.y"
 +#line 978 "awkgram.y"
      {
                static short warned = FALSE;
                char *arr = (yyvsp[(3) - (4)])->lextok;
@@@ -3034,38 -3073,38 +3034,38 @@@
          }
      break;
  
 -  case 62:
 +  case 61:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1031 "awkgram.y"
 +#line 997 "awkgram.y"
      { (yyval) = optimize_assignment((yyvsp[(1) - (1)])); }
      break;
  
 -  case 63:
 +  case 62:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1036 "awkgram.y"
 +#line 1002 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 64:
 +  case 63:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1038 "awkgram.y"
 +#line 1004 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 65:
 +  case 64:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1043 "awkgram.y"
 +#line 1009 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 66:
 +  case 65:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1045 "awkgram.y"
 +#line 1011 "awkgram.y"
      {
                if ((yyvsp[(1) - (2)]) == NULL)
                        (yyval) = list_create((yyvsp[(2) - (2)]));
@@@ -3074,17 -3113,17 +3074,17 @@@
          }
      break;
  
 -  case 67:
 +  case 66:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1052 "awkgram.y"
 +#line 1018 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 68:
 +  case 67:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1057 "awkgram.y"
 +#line 1023 "awkgram.y"
      {
                INSTRUCTION *casestmt = (yyvsp[(5) - (5)]);
                if ((yyvsp[(5) - (5)]) == NULL)
@@@ -3098,10 -3137,10 +3098,10 @@@
          }
      break;
  
 -  case 69:
 +  case 68:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1069 "awkgram.y"
 +#line 1035 "awkgram.y"
      {
                INSTRUCTION *casestmt = (yyvsp[(4) - (4)]);
                if ((yyvsp[(4) - (4)]) == NULL)
@@@ -3114,17 -3153,17 +3114,17 @@@
          }
      break;
  
 -  case 70:
 +  case 69:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1083 "awkgram.y"
 +#line 1049 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 71:
 +  case 70:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1085 "awkgram.y"
 +#line 1051 "awkgram.y"
      { 
                (yyvsp[(2) - (2)])->memory->numbr = -(force_number((yyvsp[(2) - 
(2)])->memory));
                bcfree((yyvsp[(1) - (2)]));
@@@ -3132,60 -3171,60 +3132,60 @@@
          }
      break;
  
 -  case 72:
 +  case 71:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1091 "awkgram.y"
 +#line 1057 "awkgram.y"
      {
                bcfree((yyvsp[(1) - (2)]));
                (yyval) = (yyvsp[(2) - (2)]);
          }
      break;
  
 -  case 73:
 +  case 72:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1096 "awkgram.y"
 +#line 1062 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 74:
 +  case 73:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1098 "awkgram.y"
 +#line 1064 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->opcode = Op_push_re;
                (yyval) = (yyvsp[(1) - (1)]);
          }
      break;
  
 -  case 75:
 +  case 74:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1106 "awkgram.y"
 +#line 1072 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 76:
 +  case 75:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1108 "awkgram.y"
 +#line 1074 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 78:
 +  case 77:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1118 "awkgram.y"
 +#line 1084 "awkgram.y"
      {
                (yyval) = (yyvsp[(2) - (3)]);
          }
      break;
  
 -  case 79:
 +  case 78:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1125 "awkgram.y"
 +#line 1091 "awkgram.y"
      {
                in_print = FALSE;
                in_parens = 0;
@@@ -3193,17 -3232,17 +3193,17 @@@
          }
      break;
  
 -  case 80:
 +  case 79:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1130 "awkgram.y"
 +#line 1096 "awkgram.y"
      { in_print = FALSE; in_parens = 0; }
      break;
  
 -  case 81:
 +  case 80:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1131 "awkgram.y"
 +#line 1097 "awkgram.y"
      {
                if ((yyvsp[(1) - (3)])->redir_type == redirect_twoway
                        && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_K_getline_redir
@@@ -3213,174 -3252,162 +3213,174 @@@
          }
      break;
  
 -  case 82:
 +  case 81:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1142 "awkgram.y"
 +#line 1108 "awkgram.y"
      {
                (yyval) = mk_condition((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)]), 
(yyvsp[(6) - (6)]), NULL, NULL);
          }
      break;
  
 -  case 83:
 +  case 82:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1147 "awkgram.y"
 +#line 1113 "awkgram.y"
      {
                (yyval) = mk_condition((yyvsp[(3) - (9)]), (yyvsp[(1) - (9)]), 
(yyvsp[(6) - (9)]), (yyvsp[(7) - (9)]), (yyvsp[(9) - (9)]));
          }
      break;
  
 -  case 88:
 +  case 87:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1164 "awkgram.y"
 +#line 1130 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 89:
 +  case 88:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1166 "awkgram.y"
 +#line 1132 "awkgram.y"
      {
                bcfree((yyvsp[(1) - (2)]));
                (yyval) = (yyvsp[(2) - (2)]);
          }
      break;
  
 -  case 92:
 +  case 89:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1179 "awkgram.y"
 +#line 1140 "awkgram.y"
 +    { (yyval) = NULL; }
 +    break;
 +
 +  case 90:
 +
- /* Line 1821 of yacc.c  */
++/* Line 1806 of yacc.c  */
 +#line 1142 "awkgram.y"
 +    { (yyval) = (yyvsp[(1) - (1)]) ; }
 +    break;
 +
 +  case 91:
 +
- /* Line 1821 of yacc.c  */
++/* Line 1806 of yacc.c  */
 +#line 1147 "awkgram.y"
      {
 -              append_param((yyvsp[(1) - (1)])->lextok);
 -              (yyvsp[(1) - (1)])->lextok = NULL;
 -              bcfree((yyvsp[(1) - (1)]));
 +              (yyvsp[(1) - (1)])->param_count = 0;
 +              (yyval) = list_create((yyvsp[(1) - (1)]));
          }
      break;
  
 -  case 93:
 +  case 92:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1185 "awkgram.y"
 +#line 1152 "awkgram.y"
      {
 -              append_param((yyvsp[(3) - (3)])->lextok);
 -              (yyvsp[(3) - (3)])->lextok = NULL;
 -              bcfree((yyvsp[(3) - (3)]));
 +              (yyvsp[(3) - (3)])->param_count =  (yyvsp[(1) - 
(3)])->lasti->param_count + 1;
 +              (yyval) = list_append((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]));
                yyerrok;
          }
      break;
  
 -  case 94:
 +  case 93:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1192 "awkgram.y"
 -    { /* func_params = NULL; */ }
 +#line 1158 "awkgram.y"
 +    { (yyval) = NULL; }
      break;
  
 -  case 95:
 +  case 94:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1194 "awkgram.y"
 -    { /* func_params = NULL; */ }
 +#line 1160 "awkgram.y"
 +    { (yyval) = (yyvsp[(1) - (2)]); }
      break;
  
 -  case 96:
 +  case 95:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1196 "awkgram.y"
 -    { /* func_params = NULL; */ }
 +#line 1162 "awkgram.y"
 +    { (yyval) = (yyvsp[(1) - (3)]); }
      break;
  
 -  case 97:
 +  case 96:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1202 "awkgram.y"
 +#line 1168 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 98:
 +  case 97:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1204 "awkgram.y"
 +#line 1170 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 99:
 +  case 98:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1209 "awkgram.y"
 +#line 1175 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 100:
 +  case 99:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1211 "awkgram.y"
 +#line 1177 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 101:
 +  case 100:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1216 "awkgram.y"
 +#line 1182 "awkgram.y"
      { (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); }
      break;
  
 -  case 102:
 +  case 101:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1218 "awkgram.y"
 +#line 1184 "awkgram.y"
      {
                (yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - 
(3)]));
                yyerrok;
          }
      break;
  
 -  case 103:
 +  case 102:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1223 "awkgram.y"
 +#line 1189 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 104:
 +  case 103:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1225 "awkgram.y"
 +#line 1191 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 105:
 +  case 104:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1227 "awkgram.y"
 +#line 1193 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 106:
 +  case 105:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1229 "awkgram.y"
 +#line 1195 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 107:
 +  case 106:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1235 "awkgram.y"
 +#line 1201 "awkgram.y"
      {
                if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
                        lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@@ -3389,24 -3416,24 +3389,24 @@@
          }
      break;
  
 -  case 108:
 +  case 107:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1242 "awkgram.y"
 +#line 1208 "awkgram.y"
      { (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 109:
 +  case 108:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1244 "awkgram.y"
 +#line 1210 "awkgram.y"
      { (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 110:
 +  case 109:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1246 "awkgram.y"
 +#line 1212 "awkgram.y"
      {
                if ((yyvsp[(1) - (3)])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[(2) - (3)])->source_line,
@@@ -3424,13 -3451,13 +3424,13 @@@
          }
      break;
  
 -  case 111:
 +  case 110:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1262 "awkgram.y"
 +#line 1228 "awkgram.y"
      {
                if (do_lint_old)
 -                warning_ln((yyvsp[(2) - (3)])->source_line,
 +                      warning_ln((yyvsp[(2) - (3)])->source_line,
                                _("old awk does not support the keyword `in' 
except after `for'"));
                (yyvsp[(3) - (3)])->nexti->opcode = Op_push_array;
                (yyvsp[(2) - (3)])->opcode = Op_in_array;
@@@ -3439,10 -3466,10 +3439,10 @@@
          }
      break;
  
 -  case 112:
 +  case 111:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1272 "awkgram.y"
 +#line 1238 "awkgram.y"
      {
                if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
                        lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@@ -3451,90 -3478,90 +3451,90 @@@
          }
      break;
  
 -  case 113:
 +  case 112:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1279 "awkgram.y"
 +#line 1245 "awkgram.y"
      { (yyval) = mk_condition((yyvsp[(1) - (5)]), (yyvsp[(2) - (5)]), 
(yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)])); }
      break;
  
 -  case 114:
 +  case 113:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1281 "awkgram.y"
 +#line 1247 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 115:
 +  case 114:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1286 "awkgram.y"
 +#line 1252 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 116:
 +  case 115:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1288 "awkgram.y"
 +#line 1254 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 117:
 +  case 116:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1290 "awkgram.y"
 +#line 1256 "awkgram.y"
      { 
                (yyvsp[(2) - (2)])->opcode = Op_assign_quotient;
                (yyval) = (yyvsp[(2) - (2)]);
          }
      break;
  
 +  case 117:
 +
- /* Line 1821 of yacc.c  */
++/* Line 1806 of yacc.c  */
 +#line 1264 "awkgram.y"
 +    { (yyval) = (yyvsp[(1) - (1)]); }
 +    break;
 +
    case 118:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1298 "awkgram.y"
 +#line 1266 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 119:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1300 "awkgram.y"
 +#line 1271 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 120:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1305 "awkgram.y"
 +#line 1273 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 121:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1307 "awkgram.y"
 +#line 1278 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 122:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1312 "awkgram.y"
 +#line 1280 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
    case 123:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1314 "awkgram.y"
 -    { (yyval) = (yyvsp[(1) - (1)]); }
 -    break;
 -
 -  case 124:
 -
 -/* Line 1806 of yacc.c  */
 -#line 1316 "awkgram.y"
 +#line 1282 "awkgram.y"
      {
                int count = 2;
                int is_simple_var = FALSE;
@@@ -3583,52 -3613,52 +3583,52 @@@
          }
      break;
  
 -  case 126:
 +  case 125:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1371 "awkgram.y"
 +#line 1334 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 127:
 +  case 126:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1373 "awkgram.y"
 +#line 1336 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 128:
 +  case 127:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1375 "awkgram.y"
 +#line 1338 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 129:
 +  case 128:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1377 "awkgram.y"
 +#line 1340 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 130:
 +  case 129:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1379 "awkgram.y"
 +#line 1342 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 131:
 +  case 130:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1381 "awkgram.y"
 +#line 1344 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
 -  case 132:
 +  case 131:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1383 "awkgram.y"
 +#line 1346 "awkgram.y"
      {
                /*
                 * In BEGINFILE/ENDFILE, allow `getline var < file'
@@@ -3653,30 -3683,30 +3653,30 @@@
          }
      break;
  
 -  case 133:
 +  case 132:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1406 "awkgram.y"
 +#line 1369 "awkgram.y"
      {
                (yyvsp[(2) - (2)])->opcode = Op_postincrement;
                (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - 
(2)]));
          }
      break;
  
 -  case 134:
 +  case 133:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1411 "awkgram.y"
 +#line 1374 "awkgram.y"
      {
                (yyvsp[(2) - (2)])->opcode = Op_postdecrement;
                (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - 
(2)]));
          }
      break;
  
 -  case 135:
 +  case 134:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1416 "awkgram.y"
 +#line 1379 "awkgram.y"
      {
                if (do_lint_old) {
                    warning_ln((yyvsp[(4) - (5)])->source_line,
@@@ -3698,71 -3728,71 +3698,71 @@@
          }
      break;
  
 -  case 136:
 +  case 135:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1441 "awkgram.y"
 +#line 1404 "awkgram.y"
      {
                  (yyval) = mk_getline((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]), 
(yyvsp[(1) - (4)]), (yyvsp[(2) - (4)])->redir_type);
                  bcfree((yyvsp[(2) - (4)]));
                }
      break;
  
 +  case 136:
 +
- /* Line 1821 of yacc.c  */
++/* Line 1806 of yacc.c  */
 +#line 1410 "awkgram.y"
 +    { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
 +    break;
 +
    case 137:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1447 "awkgram.y"
 +#line 1412 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
    case 138:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1449 "awkgram.y"
 +#line 1414 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
    case 139:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1451 "awkgram.y"
 +#line 1416 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
    case 140:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1453 "awkgram.y"
 +#line 1418 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
    case 141:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1455 "awkgram.y"
 +#line 1420 "awkgram.y"
      { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
      break;
  
    case 142:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1457 "awkgram.y"
 -    { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
 -    break;
 -
 -  case 143:
 -
 -/* Line 1806 of yacc.c  */
 -#line 1462 "awkgram.y"
 +#line 1425 "awkgram.y"
      {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
      break;
  
 -  case 144:
 +  case 143:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1466 "awkgram.y"
 +#line 1429 "awkgram.y"
      {
                if ((yyvsp[(2) - (2)])->opcode == Op_match_rec) {
                        (yyvsp[(2) - (2)])->opcode = Op_nomatch;
@@@ -3795,17 -3825,17 +3795,17 @@@
           }
      break;
  
 -  case 145:
 +  case 144:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1497 "awkgram.y"
 +#line 1460 "awkgram.y"
      { (yyval) = (yyvsp[(2) - (3)]); }
      break;
  
 -  case 146:
 +  case 145:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1499 "awkgram.y"
 +#line 1462 "awkgram.y"
      {
                (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
                if ((yyval) == NULL)
@@@ -3813,10 -3843,10 +3813,10 @@@
          }
      break;
  
 -  case 147:
 +  case 146:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1505 "awkgram.y"
 +#line 1468 "awkgram.y"
      {
                (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
                if ((yyval) == NULL)
@@@ -3824,10 -3854,10 +3824,10 @@@
          }
      break;
  
 -  case 148:
 +  case 147:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1511 "awkgram.y"
 +#line 1474 "awkgram.y"
      {
                static short warned1 = FALSE;
  
@@@ -3842,52 -3872,51 +3842,52 @@@
          }
      break;
  
 -  case 151:
 +  case 150:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1526 "awkgram.y"
 +#line 1489 "awkgram.y"
      {
                (yyvsp[(1) - (2)])->opcode = Op_preincrement;
                (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - 
(2)]));
          }
      break;
  
 -  case 152:
 +  case 151:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1531 "awkgram.y"
 +#line 1494 "awkgram.y"
      {
                (yyvsp[(1) - (2)])->opcode = Op_predecrement;
                (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - 
(2)]));
          }
      break;
  
 -  case 153:
 +  case 152:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1536 "awkgram.y"
 +#line 1499 "awkgram.y"
      {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
      break;
  
 -  case 154:
 +  case 153:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1540 "awkgram.y"
 +#line 1503 "awkgram.y"
      {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
      break;
  
 -  case 155:
 +  case 154:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1544 "awkgram.y"
 +#line 1507 "awkgram.y"
      {
                if ((yyvsp[(2) - (2)])->lasti->opcode == Op_push_i
 -                              && ((yyvsp[(2) - (2)])->lasti->memory->flags & 
(STRCUR|STRING)) == 0) {
 +                      && ((yyvsp[(2) - (2)])->lasti->memory->flags & 
(STRCUR|STRING)) == 0
 +              ) {
                        (yyvsp[(2) - (2)])->lasti->memory->numbr = 
-(force_number((yyvsp[(2) - (2)])->lasti->memory));
                        (yyval) = (yyvsp[(2) - (2)]);
                        bcfree((yyvsp[(1) - (2)]));
@@@ -3898,10 -3927,10 +3898,10 @@@
          }
      break;
  
 -  case 156:
 +  case 155:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1556 "awkgram.y"
 +#line 1520 "awkgram.y"
      {
            /*
             * was: $$ = $2
@@@ -3913,20 -3942,20 +3913,20 @@@
          }
      break;
  
 -  case 157:
 +  case 156:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1569 "awkgram.y"
 +#line 1533 "awkgram.y"
      {
                func_use((yyvsp[(1) - (1)])->lasti->func_name, FUNC_USE);
                (yyval) = (yyvsp[(1) - (1)]);
          }
      break;
  
 -  case 158:
 +  case 157:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1574 "awkgram.y"
 +#line 1538 "awkgram.y"
      {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@@ -3961,10 -3990,10 +3961,10 @@@
          }
      break;
  
 -  case 159:
 +  case 158:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1610 "awkgram.y"
 +#line 1574 "awkgram.y"
      {
                param_sanity((yyvsp[(3) - (4)]));
                (yyvsp[(1) - (4)])->opcode = Op_func_call;
@@@ -3980,54 -4009,54 +3980,54 @@@
          }
      break;
  
 -  case 160:
 +  case 159:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1627 "awkgram.y"
 +#line 1591 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 161:
 +  case 160:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1629 "awkgram.y"
 +#line 1593 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 162:
 +  case 161:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1634 "awkgram.y"
 +#line 1598 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 163:
 +  case 162:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1636 "awkgram.y"
 +#line 1600 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (2)]); }
      break;
  
 -  case 164:
 +  case 163:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1641 "awkgram.y"
 +#line 1605 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 165:
 +  case 164:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1643 "awkgram.y"
 +#line 1607 "awkgram.y"
      {
                (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
      break;
  
 -  case 166:
 +  case 165:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1650 "awkgram.y"
 +#line 1614 "awkgram.y"
      {
                INSTRUCTION *ip = (yyvsp[(1) - (1)])->lasti; 
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@@ -4043,10 -4072,10 +4043,10 @@@
          }
      break;
  
 -  case 167:
 +  case 166:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1667 "awkgram.y"
 +#line 1631 "awkgram.y"
      {
                INSTRUCTION *t = (yyvsp[(2) - (3)]);
                if ((yyvsp[(2) - (3)]) == NULL) {
@@@ -4062,33 -4091,33 +4062,33 @@@
          }
      break;
  
 -  case 168:
 +  case 167:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1684 "awkgram.y"
 +#line 1648 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); }
      break;
  
 -  case 169:
 +  case 168:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1686 "awkgram.y"
 +#line 1650 "awkgram.y"
      {
                (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
      break;
  
 -  case 170:
 +  case 169:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1693 "awkgram.y"
 +#line 1657 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (2)]); }
      break;
  
 -  case 171:
 +  case 170:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1698 "awkgram.y"
 +#line 1662 "awkgram.y"
      {
                char *var_name = (yyvsp[(1) - (1)])->lextok;
  
@@@ -4098,22 -4127,26 +4098,22 @@@
          }
      break;
  
 -  case 172:
 +  case 171:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1706 "awkgram.y"
 +#line 1670 "awkgram.y"
      {
 -              NODE *n;
 -
                char *arr = (yyvsp[(1) - (2)])->lextok;
 -              if ((n = lookup(arr)) != NULL && ! isarray(n))
 -                      yyerror(_("use of non-array as array"));
 -              (yyvsp[(1) - (2)])->memory = variable(arr, Node_var_new);
 +              (yyvsp[(1) - (2)])->memory = variable((yyvsp[(1) - 
(2)])->source_line, arr, Node_var_new);
                (yyvsp[(1) - (2)])->opcode = Op_push_array;
                (yyval) = list_prepend((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)]));
          }
      break;
  
 -  case 173:
 +  case 172:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1720 "awkgram.y"
 +#line 1680 "awkgram.y"
      {
                INSTRUCTION *ip = (yyvsp[(1) - (1)])->nexti;
                if (ip->opcode == Op_push
@@@ -4127,10 -4160,10 +4127,10 @@@
          }
      break;
  
 -  case 174:
 +  case 173:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1732 "awkgram.y"
 +#line 1692 "awkgram.y"
      {
                (yyval) = list_append((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)]));
                if ((yyvsp[(3) - (3)]) != NULL)
@@@ -4138,70 -4171,70 +4138,70 @@@
          }
      break;
  
 -  case 175:
 +  case 174:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1741 "awkgram.y"
 +#line 1701 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->opcode = Op_postincrement;
          }
      break;
  
 -  case 176:
 +  case 175:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1745 "awkgram.y"
 +#line 1705 "awkgram.y"
      {
                (yyvsp[(1) - (1)])->opcode = Op_postdecrement;
          }
      break;
  
 -  case 177:
 +  case 176:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1748 "awkgram.y"
 +#line 1708 "awkgram.y"
      { (yyval) = NULL; }
      break;
  
 -  case 179:
 +  case 178:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1756 "awkgram.y"
 +#line 1716 "awkgram.y"
      { yyerrok; }
      break;
  
 -  case 180:
 +  case 179:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1760 "awkgram.y"
 +#line 1720 "awkgram.y"
      { yyerrok; }
      break;
  
 -  case 183:
 +  case 182:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1769 "awkgram.y"
 +#line 1729 "awkgram.y"
      { yyerrok; }
      break;
  
 -  case 184:
 +  case 183:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1773 "awkgram.y"
 +#line 1733 "awkgram.y"
      { (yyval) = (yyvsp[(1) - (1)]); yyerrok; }
      break;
  
 -  case 185:
 +  case 184:
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 1777 "awkgram.y"
 +#line 1737 "awkgram.y"
      { yyerrok; }
      break;
  
  
  
- /* Line 1821 of yacc.c  */
+ /* Line 1806 of yacc.c  */
 -#line 4250 "awkgram.c"
 +#line 4217 "awkgram.c"
        default: break;
      }
    /* User semantic actions sometimes alter yychar, and that requires

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                      |   61 ++-
 Makefile.am                    |   24 +-
 Makefile.in                    |   62 +-
 NEWS                           |   11 +
 array.c                        |  105 ++--
 awk.h                          |   56 +-
 awkgram.c                      |  778 +++++++++---------
 awkgram.y                      |   74 +-
 cint_array.c                   |    7 +-
 debug.c                        |   25 +-
 dfa.c                          |    2 +-
 doc/ChangeLog                  |    8 +
 doc/awkcard.in                 |   21 +-
 doc/gawk.1                     |  126 ++--
 doc/gawk.info                  | 1744 +++++++++++++++++++++-------------------
 doc/gawk.texi                  |  444 ++++++-----
 eval.c                         | 1295 ++----------------------------
 eval_d.c                       |   27 -
 eval_p.c                       |   27 -
 ext.c                          |   94 ++-
 int_array.c                    |    6 +-
 interpret.h                    | 1187 +++++++++++++++++++++++++++
 io.c                           |   70 ++-
 main.c                         |   84 ++-
 profile.c                      |   31 +-
 regexec.c                      |   12 +-
 str_array.c                    |    9 +-
 test/ChangeLog                 |    9 +
 test/Makefile.am               |   16 +-
 test/Makefile.in               |   16 +-
 test/badargs.ok                |    3 +
 test/rri1.awk                  |    1 +
 test/rri1.in                   |    1 +
 test/{arrayprm2.ok => rri1.ok} |    0
 34 files changed, 3372 insertions(+), 3064 deletions(-)
 delete mode 100644 eval_d.c
 delete mode 100644 eval_p.c
 create mode 100644 interpret.h
 create mode 100644 test/rri1.awk
 create mode 100644 test/rri1.in
 copy test/{arrayprm2.ok => rri1.ok} (100%)


hooks/post-receive
-- 
gawk



reply via email to

[Prev in Thread] Current Thread [Next in Thread]