gawk-diffs
[Top][All Lists]
Advanced

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

[SCM] gawk branch, gawk-5.1-stable, updated. gawk-4.1.0-4006-gefd054b


From: Arnold Robbins
Subject: [SCM] gawk branch, gawk-5.1-stable, updated. gawk-4.1.0-4006-gefd054b
Date: Thu, 2 Jul 2020 03:31:30 -0400 (EDT)

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, gawk-5.1-stable has been updated
       via  efd054b9800ec926587d2903f0712c68d4591d43 (commit)
       via  85da96b705877b4a10b0a96b3d9722536674b2d0 (commit)
      from  8136d3d5824f666a6da09460c4654a9ef856ad47 (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=efd054b9800ec926587d2903f0712c68d4591d43

commit efd054b9800ec926587d2903f0712c68d4591d43
Author: Arnold D. Robbins <arnold@skeeve.com>
Date:   Thu Jul 2 10:30:03 2020 +0300

    Add instruction trace option.

diff --git a/ChangeLog b/ChangeLog
index eac3a12..394b0ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,14 @@
        * eval.c (posix_compare): Rewrite contributed by
        Michael Builov <mbuilov@gmail.com>.
 
+       Unrelated:
+
+       * awk.h: New option: do_itrace.
+       * interpret.h (r_interpret): Print instruction trace if enabled.
+       * main.c (optab): New option: -I/--trace.
+       (parse_args): Update optlist and the code to handle it.
+       * NEWS: Updated.
+
 2020-06-29         Arnold D. Robbins     <arnold@skeeve.com>
 
        * debug.c: Cleanup messages. Error messages start with lower
diff --git a/NEWS b/NEWS
index 1974e7b..1c5ddec 100644
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,9 @@ Changes from 5.0.1 to 5.0.2
    second destination array is supplied. Similarly, using either array as
    the second argument is now a fatal error.
 
+3. The new -I/--trace option prints a trace of the byte codes as they
+   are executed.
+
 Changes from 5.0.1 to 5.1.0
 ---------------------------
 
diff --git a/awk.h b/awk.h
index cccb8ce..eec4114 100644
--- a/awk.h
+++ b/awk.h
@@ -1159,7 +1159,8 @@ enum do_flag_values {
        DO_SANDBOX         = 0x01000,   /* sandbox mode - disable 'system' 
function & redirections */
        DO_PROFILE         = 0x02000,   /* profile the program */
        DO_DEBUG           = 0x04000,   /* debug the program */
-       DO_MPFR            = 0x08000    /* arbitrary-precision floating-point 
math */
+       DO_MPFR            = 0x08000,   /* arbitrary-precision floating-point 
math */
+       DO_ITRACE          = 0x10000    /* trace byte-code instructions */
 };
 
 #define do_traditional      (do_flags & DO_TRADITIONAL)
@@ -1174,6 +1175,7 @@ enum do_flag_values {
 #define do_sandbox          (do_flags & DO_SANDBOX)
 #define do_debug            (do_flags & DO_DEBUG)
 #define do_mpfr             (do_flags & DO_MPFR)
+#define do_itrace           (do_flags & DO_ITRACE)
 
 extern bool do_optimize;
 extern int use_lc_numeric;
diff --git a/doc/ChangeLog b/doc/ChangeLog
index c1df31f..4f8142d 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@
+2020-07-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+       * gawk.1, gawktexi.in: Document -I/--trace option.
+
 2020-06-25         Arnold D. Robbins     <arnold@skeeve.com>
 
        * gawk.1: Applied some more troff "lint" fixes.
diff --git a/doc/gawk.1 b/doc/gawk.1
index 8005c26..a4d8912 100644
--- a/doc/gawk.1
+++ b/doc/gawk.1
@@ -13,7 +13,7 @@
 .              if \w'\(rq' .ds rq "\(rq
 .      \}
 .\}
-.TH GAWK 1 "Mar 23 2020" "Free Software Foundation" "Utility Commands"
+.TH GAWK 1 "Jul 2 2020" "Free Software Foundation" "Utility Commands"
 .SH NAME
 gawk \- pattern scanning and processing language
 .SH SYNOPSIS
@@ -321,6 +321,17 @@ Files read with
 are treated as if they begin with an implicit \fB@namespace "awk"\fR statement.
 .TP
 .PD 0
+.BI \-I
+.TP
+.PD
+.B \-\^\-trace
+Print the internal byte code names as they are executed when running
+the program. The trace is printed to standard error. Each ``op code''
+is preceded by a
+.B +
+sign in the output.
+.TP
+.PD 0
 .BI "\-l " lib
 .TP
 .PD
diff --git a/doc/gawk.info b/doc/gawk.info
index 2372931..62bea4b 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -2666,6 +2666,12 @@ The following list describes options mandated by the 
POSIX standard:
      at their beginning.  *Note Changing The Namespace::, for more
      information.
 
+'-I'
+'--trace'
+     Print the internal byte code names as they are executed when
+     running the program.  The trace is printed to standard error.  Each
+     "op code" is preceded by a '+' sign in the output.
+
 '-l' EXT
 '--load' EXT
      Load a dynamic extension named EXT.  Extensions are stored as
@@ -33935,7 +33941,7 @@ Index
 * + (plus sign), += operator <1>:        Precedence.          (line  94)
 * , (comma), in range patterns:          Ranges.              (line   6)
 * - (hyphen), file names beginning with: Options.             (line  64)
-* - (hyphen), -- end of options marker:  Options.             (line 343)
+* - (hyphen), -- end of options marker:  Options.             (line 349)
 * - (hyphen), in bracket expressions:    Bracket Expressions. (line  25)
 * - (hyphen), -= operator:               Assignment Ops.      (line 129)
 * - (hyphen), -- operator:               Increment Ops.       (line  48)
@@ -33944,7 +33950,7 @@ Index
 * - (hyphen), - operator <1>:            Precedence.          (line  57)
 * - (hyphen), -= operator <1>:           Precedence.          (line  94)
 * --assign option:                       Options.             (line  36)
-* --bignum option:                       Options.             (line 237)
+* --bignum option:                       Options.             (line 243)
 * --characters-as-bytes option:          Options.             (line  73)
 * --copyright option:                    Options.             (line  93)
 * --debug option:                        Options.             (line 112)
@@ -33970,32 +33976,33 @@ Index
 * --help option:                         Options.             (line 176)
 * --include option:                      Options.             (line 181)
 * --lint option:                         Command Line.        (line  20)
-* --lint option <1>:                     Options.             (line 210)
-* --lint-old option:                     Options.             (line 333)
-* --load option:                         Options.             (line 198)
-* --no-optimize option:                  Options.             (line 318)
-* --non-decimal-data option:             Options.             (line 243)
+* --lint option <1>:                     Options.             (line 216)
+* --lint-old option:                     Options.             (line 339)
+* --load option:                         Options.             (line 204)
+* --no-optimize option:                  Options.             (line 324)
+* --non-decimal-data option:             Options.             (line 249)
 * --non-decimal-data option <1>:         Nondecimal Data.     (line   6)
 * --non-decimal-data option, strtonum() function and: Nondecimal Data.
                                                               (line  35)
-* --optimize option:                     Options.             (line 268)
-* --posix option:                        Options.             (line 290)
-* --posix option, --traditional option and: Options.          (line 305)
-* --pretty-print option:                 Options.             (line 257)
-* --profile option:                      Options.             (line 278)
+* --optimize option:                     Options.             (line 274)
+* --posix option:                        Options.             (line 296)
+* --posix option, --traditional option and: Options.          (line 311)
+* --pretty-print option:                 Options.             (line 263)
+* --profile option:                      Options.             (line 284)
 * --profile option <1>:                  Profiling.           (line  12)
-* --re-interval option:                  Options.             (line 311)
-* --sandbox option:                      Options.             (line 323)
+* --re-interval option:                  Options.             (line 317)
+* --sandbox option:                      Options.             (line 329)
 * --sandbox option, input redirection with getline: Getline.  (line  19)
 * --sandbox option, output redirection with print, printf: Redirection.
                                                               (line   6)
 * --sandbox option, disabling system() function: I/O Functions.
                                                               (line 128)
 * --source option:                       Options.             (line 121)
+* --trace option:                        Options.             (line 198)
 * --traditional option:                  Options.             (line  86)
-* --traditional option, --posix option and: Options.          (line 305)
-* --use-lc-numeric option:               Options.             (line 252)
-* --version option:                      Options.             (line 338)
+* --traditional option, --posix option and: Options.          (line 311)
+* --use-lc-numeric option:               Options.             (line 258)
+* --version option:                      Options.             (line 344)
 * -b option:                             Options.             (line  73)
 * -c option:                             Options.             (line  86)
 * -C option:                             Options.             (line  93)
@@ -34003,32 +34010,33 @@ Index
 * -D option:                             Options.             (line 112)
 * -e option:                             Options.             (line 121)
 * -E option:                             Options.             (line 147)
-* -e option <1>:                         Options.             (line 378)
+* -e option <1>:                         Options.             (line 384)
 * -f option:                             Long.                (line  12)
 * -F option:                             Options.             (line  21)
 * -f option <1>:                         Options.             (line  25)
-* -F option, -Ft sets FS to TAB:         Options.             (line 350)
-* -f option, multiple uses:              Options.             (line 355)
+* -F option, -Ft sets FS to TAB:         Options.             (line 356)
+* -f option, multiple uses:              Options.             (line 361)
 * -F option, command-line:               Command Line Field Separator.
                                                               (line   6)
 * -g option:                             Options.             (line 169)
 * -h option:                             Options.             (line 176)
 * -i option:                             Options.             (line 181)
-* -l option:                             Options.             (line 198)
-* -l option <1>:                         Options.             (line 210)
-* -L option:                             Options.             (line 333)
-* -M option:                             Options.             (line 237)
-* -n option:                             Options.             (line 243)
-* -N option:                             Options.             (line 252)
-* -o option:                             Options.             (line 257)
-* -O option:                             Options.             (line 268)
-* -p option:                             Options.             (line 278)
-* -P option:                             Options.             (line 290)
-* -r option:                             Options.             (line 311)
-* -s option:                             Options.             (line 318)
-* -S option:                             Options.             (line 323)
+* -I option:                             Options.             (line 198)
+* -l option:                             Options.             (line 204)
+* -l option <1>:                         Options.             (line 216)
+* -L option:                             Options.             (line 339)
+* -M option:                             Options.             (line 243)
+* -n option:                             Options.             (line 249)
+* -N option:                             Options.             (line 258)
+* -o option:                             Options.             (line 263)
+* -O option:                             Options.             (line 274)
+* -p option:                             Options.             (line 284)
+* -P option:                             Options.             (line 296)
+* -r option:                             Options.             (line 317)
+* -s option:                             Options.             (line 324)
+* -S option:                             Options.             (line 329)
 * -v option:                             Options.             (line  36)
-* -V option:                             Options.             (line 338)
+* -V option:                             Options.             (line 344)
 * -v option <1>:                         Assignment Options.  (line  12)
 * -W option:                             Options.             (line  51)
 * . (period), regexp operator:           Regexp Operator Details.
@@ -34262,7 +34270,7 @@ Index
 * arguments, command-line <1>:           Auto-set.            (line  15)
 * arguments, command-line <2>:           ARGC and ARGV.       (line   6)
 * arguments, processing:                 Getopt Function.     (line   6)
-* ARGV array:                            Options.             (line 323)
+* ARGV array:                            Options.             (line 329)
 * ARGV array, indexing into:             Other Arguments.     (line  21)
 * arithmetic operators:                  Arithmetic Ops.      (line   6)
 * array manipulation in extensions:      Array Manipulation.  (line   6)
@@ -34386,7 +34394,7 @@ Index
 * awk, uses for <1>:                     Getting Started.     (line  12)
 * awk, uses for <2>:                     When.                (line   6)
 * awk, invoking:                         Command Line.        (line   6)
-* awk, profiling, enabling:              Options.             (line 278)
+* awk, profiling, enabling:              Options.             (line 284)
 * awk, implementations, limits:          Getline Notes.       (line  14)
 * awk, implementation issues, pipes:     Redirection.         (line 129)
 * awk, new vs. old, OFMT variable:       Strings And Numbers. (line  56)
@@ -34825,7 +34833,7 @@ Index
 * cosine:                                Numeric Functions.   (line  16)
 * counting words, lines, and characters: Wc Program.          (line   6)
 * csh utility:                           Statements/Lines.    (line  45)
-* csh utility, POSIXLY_CORRECT environment variable: Options. (line 399)
+* csh utility, POSIXLY_CORRECT environment variable: Options. (line 405)
 * csh utility, |& operator, comparison with: Two-way I/O.     (line  27)
 * ctime() user-defined function:         Function Example.    (line  74)
 * Curreli, Marco:                        Contributors.        (line 147)
@@ -35050,7 +35058,7 @@ Index
 * debugging, example session:            Sample Debugging Session.
                                                               (line   6)
 * debugging gawk, bug reports:           Bugs.                (line   9)
-* decimal point character, locale specific: Options.          (line 302)
+* decimal point character, locale specific: Options.          (line 308)
 * decrement operators:                   Increment Ops.       (line  35)
 * default keyword:                       Switch Statement.    (line   6)
 * Deifik, Scott:                         Acknowledgments.     (line  60)
@@ -35237,7 +35245,7 @@ Index
 * endpwent() user-defined function:      Passwd Functions.    (line 211)
 * English, Steve:                        Advanced Features.   (line   6)
 * ENVIRON array:                         Auto-set.            (line  59)
-* environment variables, POSIXLY_CORRECT: Options.            (line 384)
+* environment variables, POSIXLY_CORRECT: Options.            (line 390)
 * environment variables, used by gawk:   Environment Variables.
                                                               (line   6)
 * environment variables, AWKPATH:        AWKPATH Variable.    (line   6)
@@ -35530,7 +35538,7 @@ Index
 * Free Software Foundation (FSF) <3>:    Glossary.            (line 403)
 * FreeBSD:                               Glossary.            (line 747)
 * FS variable, --field-separator option and: Options.         (line  21)
-* FS variable, TAB character as:         Options.             (line 299)
+* FS variable, TAB character as:         Options.             (line 305)
 * FS variable:                           Field Separators.    (line  15)
 * FS variable, changing value of:        Field Separators.    (line  34)
 * FS variable, containing ^:             Regexp Field Splitting.
@@ -35605,8 +35613,8 @@ Index
 * gawk, uses for:                        Preface.             (line  34)
 * gawk, awk and <1>:                     This Manual.         (line  14)
 * gawk, newlines in:                     Statements/Lines.    (line  12)
-* gawk, extensions, disabling:           Options.             (line 290)
-* gawk, version of, printing information about: Options.      (line 338)
+* gawk, extensions, disabling:           Options.             (line 296)
+* gawk, version of, printing information about: Options.      (line 344)
 * gawk, ARGIND variable in:              Other Arguments.     (line  21)
 * gawk, PROCINFO array in:               Other Arguments.     (line  21)
 * gawk, escape sequences:                Escape Sequences.    (line 121)
@@ -35810,13 +35818,13 @@ Index
 * help debugger command:                 Miscellaneous Debugger Commands.
                                                               (line  67)
 * hexadecimal numbers:                   Nondecimal-numbers.  (line   6)
-* hexadecimal values, enabling interpretation of: Options.    (line 243)
+* hexadecimal values, enabling interpretation of: Options.    (line 249)
 * history expansion, in debugger:        Readline Support.    (line   6)
 * histsort.awk program:                  History Sorting.     (line  25)
 * Hughes, Phil:                          Acknowledgments.     (line  43)
 * HUP signal, for dynamic profiling:     Profiling.           (line 211)
 * hyphen (-), file names beginning with: Options.             (line  64)
-* hyphen (-), -- end of options marker:  Options.             (line 343)
+* hyphen (-), -- end of options marker:  Options.             (line 349)
 * hyphen (-), in bracket expressions:    Bracket Expressions. (line  25)
 * hyphen (-), -= operator:               Assignment Ops.      (line 129)
 * hyphen (-), -- operator:               Increment Ops.       (line  48)
@@ -35900,6 +35908,7 @@ Index
 * installing gawk, Cygwin:               Cygwin.              (line  21)
 * installing gawk, VMS:                  VMS Installation.    (line   6)
 * instruction tracing, in debugger:      Debugger Info.       (line  90)
+* instructions, trace of internal:       Options.             (line 198)
 * int:                                   Numeric Functions.   (line  24)
 * INT signal (MS-Windows):               Profiling.           (line 214)
 * integer array indices:                 Numeric Array Subscripts.
@@ -36035,9 +36044,9 @@ Index
 * lines, counting:                       Wc Program.          (line   6)
 * lines, duplicate, removing:            History Sorting.     (line   6)
 * lint checking, empty programs:         Command Line.        (line  16)
-* lint checking, issuing warnings:       Options.             (line 210)
+* lint checking, issuing warnings:       Options.             (line 216)
 * lint checking, POSIXLY_CORRECT environment variable: Options.
-                                                              (line 384)
+                                                              (line 390)
 * lint checking:                         User-modified.       (line  90)
 * lint checking, array subscripts:       Uninitialized Subscripts.
                                                               (line  43)
@@ -36050,13 +36059,13 @@ Index
 * list function definitions, in debugger: Debugger Info.      (line  30)
 * @load directive:                       Loading Shared Libraries.
                                                               (line   8)
-* loading extensions:                    Options.             (line 198)
+* loading extensions:                    Options.             (line 204)
 * loading extensions, @load directive:   Loading Shared Libraries.
                                                               (line   8)
 * local variables, in a function:        Variable Scope.      (line   6)
 * local variables, show in debugger:     Debugger Info.       (line  34)
 * locale categories:                     Explaining gettext.  (line  81)
-* locale decimal point character:        Options.             (line 302)
+* locale decimal point character:        Options.             (line 308)
 * locale, definition of:                 Locales.             (line   6)
 * log:                                   Numeric Functions.   (line  29)
 * log files, timestamps in:              Time Functions.      (line   6)
@@ -36168,7 +36177,7 @@ Index
 * networks, support for:                 Special Network.     (line   6)
 * networks, programming:                 TCP/IP Networking.   (line   6)
 * newlines:                              Statements/Lines.    (line   6)
-* newlines <1>:                          Options.             (line 296)
+* newlines <1>:                          Options.             (line 302)
 * newlines, in dynamic regexps:          Computed Regexps.    (line  60)
 * newlines, in regexp constants:         Computed Regexps.    (line  70)
 * newlines, as record separators:        awk split records.   (line  12)
@@ -36243,7 +36252,7 @@ Index
 * o debugger command (alias for option): Debugger Info.       (line  57)
 * obsolete features:                     Obsolete.            (line   6)
 * octal numbers:                         Nondecimal-numbers.  (line   6)
-* octal values, enabling interpretation of: Options.          (line 243)
+* octal values, enabling interpretation of: Options.          (line 249)
 * OFMT variable:                         OFMT.                (line  15)
 * OFMT variable, POSIX awk and:          OFMT.                (line  27)
 * OFMT variable <1>:                     Strings And Numbers. (line  56)
@@ -36251,6 +36260,7 @@ Index
 * OFS variable:                          Changing Fields.     (line  64)
 * OFS variable <1>:                      Output Separators.   (line   6)
 * OFS variable <2>:                      User-modified.       (line 116)
+* op-codes, trace of internal:           Options.             (line 198)
 * OpenBSD:                               Glossary.            (line 747)
 * OpenSolaris:                           Other Versions.      (line  96)
 * operating systems, BSD-based:          Manual History.      (line  28)
@@ -36374,7 +36384,7 @@ Index
 * portability, #! (executable scripts):  Executable Scripts.  (line  29)
 * portability, ARGV variable:            Executable Scripts.  (line  55)
 * portability, backslash continuation and: Statements/Lines.  (line  30)
-* portability, POSIXLY_CORRECT environment variable: Options. (line 404)
+* portability, POSIXLY_CORRECT environment variable: Options. (line 410)
 * portability:                           Escape Sequences.    (line 103)
 * portability, backslash in escape sequences: Escape Sequences.
                                                               (line 108)
@@ -36450,8 +36460,8 @@ Index
 * POSIX awk, date utility and:           Time Functions.      (line 255)
 * POSIX awk, function keyword in:        Definition Syntax.   (line  99)
 * POSIX awk, changes in awk versions:    POSIX.               (line   6)
-* POSIX mode:                            Options.             (line 290)
-* POSIX mode <1>:                        Options.             (line 384)
+* POSIX mode:                            Options.             (line 296)
+* POSIX mode <1>:                        Options.             (line 390)
 * POSIX mode <2>:                        Regexp Operator Details.
                                                               (line  47)
 * POSIX mode <3>:                        Input Summary.       (line  69)
@@ -36471,7 +36481,7 @@ Index
 * POSIX mode <12>:                       POSIX Floating Point Problems.
                                                               (line  83)
 * POSIX mode <13>:                       Feature History.     (line 313)
-* POSIXLY_CORRECT environment variable:  Options.             (line 384)
+* POSIXLY_CORRECT environment variable:  Options.             (line 390)
 * PREC variable:                         User-modified.       (line 127)
 * precedence, regexp operators:          Regexp Operator Details.
                                                               (line 137)
@@ -36483,7 +36493,7 @@ Index
 * predefined variables, conveying information: Auto-set.      (line   6)
 * pretty printer, interaction with namespaces: Namespace And Features.
                                                               (line   9)
-* pretty printing:                       Options.             (line 255)
+* pretty printing:                       Options.             (line 261)
 * pretty printing <1>:                   Profiling.           (line 222)
 * pretty printing, profiling, difference with: Profiling.     (line 229)
 * print debugger command:                Viewing And Changing Data.
@@ -36647,7 +36657,7 @@ Index
 * regexp constants, as patterns:         Expression Patterns. (line  34)
 * register loadable extension:           Registration Functions.
                                                               (line   6)
-* regular expressions, interval expressions and: Options.     (line 311)
+* regular expressions, interval expressions and: Options.     (line 317)
 * regular expressions:                   Regexp.              (line   6)
 * regular expressions, as patterns:      Regexp Usage.        (line   6)
 * regular expressions, operators:        Regexp Usage.        (line  19)
@@ -36747,7 +36757,7 @@ Index
                                                               (line  68)
 * sample debugging session:              Sample Debugging Session.
                                                               (line   6)
-* sandbox mode:                          Options.             (line 323)
+* sandbox mode:                          Options.             (line 329)
 * save debugger options:                 Debugger Info.       (line  85)
 * scalar or array:                       Type Functions.      (line  11)
 * scalar values:                         Basic Data Typing.   (line  13)
@@ -37091,13 +37101,14 @@ Index
 * tr utility:                            Translate Program.   (line   6)
 * trace debugger command:                Miscellaneous Debugger Commands.
                                                               (line 108)
+* trace, internal instructions:          Options.             (line 198)
 * traceback, display in debugger:        Execution Stack.     (line  13)
 * translate string:                      I18N Functions.      (line  21)
 * translate.awk program:                 Translate Program.   (line  55)
 * treating files, as single records:     gawk split records.  (line  96)
 * troubleshooting, typographical errors, global variables: Options.
                                                               (line 103)
-* troubleshooting, --non-decimal-data option: Options.        (line 243)
+* troubleshooting, --non-decimal-data option: Options.        (line 249)
 * troubleshooting, backslash before nonspecial character: Escape Sequences.
                                                               (line 108)
 * troubleshooting, regexp constants vs. string constants: Computed Regexps.
@@ -37271,7 +37282,7 @@ Index
 * Wall, Larry:                           Array Intro.         (line   6)
 * Wall, Larry <1>:                       Future Extensions.   (line   6)
 * Wallin, Anders:                        Contributors.        (line 106)
-* warnings, issuing:                     Options.             (line 210)
+* warnings, issuing:                     Options.             (line 216)
 * watch debugger command:                Viewing And Changing Data.
                                                               (line  70)
 * watchpoint (debugger):                 Debugging Terms.     (line  42)
@@ -37284,7 +37295,7 @@ Index
                                                               (line  13)
 * while statement, use of regexps in:    Regexp Usage.        (line  19)
 * while statement:                       While Statement.     (line   6)
-* whitespace, newlines as:               Options.             (line 296)
+* whitespace, newlines as:               Options.             (line 302)
 * whitespace, definition of:             Fields.              (line   6)
 * whitespace, as field separators:       Default Field Splitting.
                                                               (line   6)
@@ -37358,560 +37369,560 @@ Node: Intro Summary116359
 Node: Invoking Gawk117243
 Node: Command Line118757
 Node: Options119555
-Ref: Options-Footnote-1137224
-Ref: Options-Footnote-2137455
-Node: Other Arguments137480
-Node: Naming Standard Input140787
-Node: Environment Variables141997
-Node: AWKPATH Variable142555
-Ref: AWKPATH Variable-Footnote-1145967
-Ref: AWKPATH Variable-Footnote-2146001
-Node: AWKLIBPATH Variable146372
-Ref: AWKLIBPATH Variable-Footnote-1148069
-Node: Other Environment Variables148444
-Node: Exit Status152265
-Node: Include Files152942
-Node: Loading Shared Libraries156632
-Node: Obsolete158060
-Node: Undocumented158752
-Node: Invoking Summary159049
-Node: Regexp161890
-Node: Regexp Usage163344
-Node: Escape Sequences165381
-Node: Regexp Operators171622
-Node: Regexp Operator Details172107
-Ref: Regexp Operator Details-Footnote-1178539
-Node: Interval Expressions178686
-Ref: Interval Expressions-Footnote-1180107
-Node: Bracket Expressions180205
-Ref: table-char-classes182681
-Node: Leftmost Longest186007
-Node: Computed Regexps187310
-Node: GNU Regexp Operators190737
-Node: Case-sensitivity194474
-Ref: Case-sensitivity-Footnote-1197340
-Ref: Case-sensitivity-Footnote-2197575
-Node: Regexp Summary197683
-Node: Reading Files199149
-Node: Records201418
-Node: awk split records202493
-Node: gawk split records207768
-Ref: gawk split records-Footnote-1212501
-Node: Fields212538
-Node: Nonconstant Fields215279
-Ref: Nonconstant Fields-Footnote-1217515
-Node: Changing Fields217719
-Node: Field Separators223750
-Node: Default Field Splitting226448
-Node: Regexp Field Splitting227566
-Node: Single Character Fields230919
-Node: Command Line Field Separator231979
-Node: Full Line Fields235197
-Ref: Full Line Fields-Footnote-1236719
-Ref: Full Line Fields-Footnote-2236765
-Node: Field Splitting Summary236866
-Node: Constant Size238940
-Node: Fixed width data239672
-Node: Skipping intervening243139
-Node: Allowing trailing data243937
-Node: Fields with fixed data244974
-Node: Splitting By Content246492
-Ref: Splitting By Content-Footnote-1250275
-Node: More CSV250438
-Node: Testing field creation251748
-Node: Multiple Line253373
-Node: Getline259650
-Node: Plain Getline262119
-Node: Getline/Variable264692
-Node: Getline/File265843
-Node: Getline/Variable/File267231
-Ref: Getline/Variable/File-Footnote-1268836
-Node: Getline/Pipe268924
-Node: Getline/Variable/Pipe271628
-Node: Getline/Coprocess272763
-Node: Getline/Variable/Coprocess274030
-Node: Getline Notes274772
-Node: Getline Summary277569
-Ref: table-getline-variants277993
-Node: Read Timeout278741
-Ref: Read Timeout-Footnote-1282647
-Node: Retrying Input282705
-Node: Command-line directories283904
-Node: Input Summary284810
-Node: Input Exercises287982
-Node: Printing288416
-Node: Print290250
-Node: Print Examples291707
-Node: Output Separators294487
-Node: OFMT296504
-Node: Printf297860
-Node: Basic Printf298645
-Node: Control Letters300219
-Node: Format Modifiers305383
-Node: Printf Examples311398
-Node: Redirection313884
-Node: Special FD320725
-Ref: Special FD-Footnote-1323893
-Node: Special Files323967
-Node: Other Inherited Files324584
-Node: Special Network325585
-Node: Special Caveats326445
-Node: Close Files And Pipes327394
-Ref: table-close-pipe-return-values334301
-Ref: Close Files And Pipes-Footnote-1335114
-Ref: Close Files And Pipes-Footnote-2335262
-Node: Nonfatal335414
-Node: Output Summary337752
-Node: Output Exercises338974
-Node: Expressions339653
-Node: Values340841
-Node: Constants341519
-Node: Scalar Constants342210
-Ref: Scalar Constants-Footnote-1344734
-Node: Nondecimal-numbers344984
-Node: Regexp Constants347985
-Node: Using Constant Regexps348511
-Node: Standard Regexp Constants349133
-Node: Strong Regexp Constants352321
-Node: Variables355333
-Node: Using Variables355990
-Node: Assignment Options357900
-Node: Conversion360371
-Node: Strings And Numbers360895
-Ref: Strings And Numbers-Footnote-1363958
-Node: Locale influences conversions364067
-Ref: table-locale-affects366825
-Node: All Operators367443
-Node: Arithmetic Ops368072
-Node: Concatenation370578
-Ref: Concatenation-Footnote-1373425
-Node: Assignment Ops373532
-Ref: table-assign-ops378523
-Node: Increment Ops379836
-Node: Truth Values and Conditions383296
-Node: Truth Values384370
-Node: Typing and Comparison385418
-Node: Variable Typing386238
-Ref: Variable Typing-Footnote-1392701
-Ref: Variable Typing-Footnote-2392773
-Node: Comparison Operators392850
-Ref: table-relational-ops393269
-Node: POSIX String Comparison396764
-Ref: POSIX String Comparison-Footnote-1398459
-Ref: POSIX String Comparison-Footnote-2398598
-Node: Boolean Ops398682
-Ref: Boolean Ops-Footnote-1403164
-Node: Conditional Exp403256
-Node: Function Calls404992
-Node: Precedence408869
-Node: Locales412528
-Node: Expressions Summary414160
-Node: Patterns and Actions416733
-Node: Pattern Overview417853
-Node: Regexp Patterns419530
-Node: Expression Patterns420072
-Node: Ranges423853
-Node: BEGIN/END426961
-Node: Using BEGIN/END427722
-Ref: Using BEGIN/END-Footnote-1430458
-Node: I/O And BEGIN/END430564
-Node: BEGINFILE/ENDFILE432878
-Node: Empty435791
-Node: Using Shell Variables436108
-Node: Action Overview438382
-Node: Statements440707
-Node: If Statement442555
-Node: While Statement444050
-Node: Do Statement446078
-Node: For Statement447226
-Node: Switch Statement450397
-Node: Break Statement452838
-Node: Continue Statement454930
-Node: Next Statement456757
-Node: Nextfile Statement459140
-Node: Exit Statement461792
-Node: Built-in Variables464195
-Node: User-modified465328
-Node: Auto-set473095
-Ref: Auto-set-Footnote-1489902
-Ref: Auto-set-Footnote-2490108
-Node: ARGC and ARGV490164
-Node: Pattern Action Summary494377
-Node: Arrays496807
-Node: Array Basics498136
-Node: Array Intro498980
-Ref: figure-array-elements500955
-Ref: Array Intro-Footnote-1503659
-Node: Reference to Elements503787
-Node: Assigning Elements506251
-Node: Array Example506742
-Node: Scanning an Array508501
-Node: Controlling Scanning511523
-Ref: Controlling Scanning-Footnote-1517979
-Node: Numeric Array Subscripts518295
-Node: Uninitialized Subscripts520479
-Node: Delete522098
-Ref: Delete-Footnote-1524850
-Node: Multidimensional524907
-Node: Multiscanning528002
-Node: Arrays of Arrays529593
-Node: Arrays Summary534361
-Node: Functions536454
-Node: Built-in537492
-Node: Calling Built-in538573
-Node: Numeric Functions540569
-Ref: Numeric Functions-Footnote-1544597
-Ref: Numeric Functions-Footnote-2545245
-Ref: Numeric Functions-Footnote-3545293
-Node: String Functions545565
-Ref: String Functions-Footnote-1569722
-Ref: String Functions-Footnote-2569850
-Ref: String Functions-Footnote-3570098
-Node: Gory Details570185
-Ref: table-sub-escapes571976
-Ref: table-sub-proposed573495
-Ref: table-posix-sub574858
-Ref: table-gensub-escapes576399
-Ref: Gory Details-Footnote-1577222
-Node: I/O Functions577376
-Ref: table-system-return-values583844
-Ref: I/O Functions-Footnote-1585924
-Ref: I/O Functions-Footnote-2586072
-Node: Time Functions586192
-Ref: Time Functions-Footnote-1596863
-Ref: Time Functions-Footnote-2596931
-Ref: Time Functions-Footnote-3597089
-Ref: Time Functions-Footnote-4597200
-Ref: Time Functions-Footnote-5597312
-Ref: Time Functions-Footnote-6597539
-Node: Bitwise Functions597805
-Ref: table-bitwise-ops598399
-Ref: Bitwise Functions-Footnote-1604462
-Ref: Bitwise Functions-Footnote-2604635
-Node: Type Functions604826
-Node: I18N Functions607689
-Node: User-defined609340
-Node: Definition Syntax610152
-Ref: Definition Syntax-Footnote-1615839
-Node: Function Example615910
-Ref: Function Example-Footnote-1618832
-Node: Function Calling618854
-Node: Calling A Function619442
-Node: Variable Scope620400
-Node: Pass By Value/Reference623394
-Node: Function Caveats626038
-Ref: Function Caveats-Footnote-1628085
-Node: Return Statement628205
-Node: Dynamic Typing631184
-Node: Indirect Calls632114
-Ref: Indirect Calls-Footnote-1642366
-Node: Functions Summary642494
-Node: Library Functions645199
-Ref: Library Functions-Footnote-1648806
-Ref: Library Functions-Footnote-2648949
-Node: Library Names649120
-Ref: Library Names-Footnote-1652787
-Ref: Library Names-Footnote-2653010
-Node: General Functions653096
-Node: Strtonum Function654199
-Node: Assert Function657221
-Node: Round Function660547
-Node: Cliff Random Function662087
-Node: Ordinal Functions663103
-Ref: Ordinal Functions-Footnote-1666166
-Ref: Ordinal Functions-Footnote-2666418
-Node: Join Function666628
-Ref: Join Function-Footnote-1668398
-Node: Getlocaltime Function668598
-Node: Readfile Function672340
-Node: Shell Quoting674317
-Node: Data File Management675718
-Node: Filetrans Function676350
-Node: Rewind Function680446
-Node: File Checking682355
-Ref: File Checking-Footnote-1683689
-Node: Empty Files683890
-Node: Ignoring Assigns685869
-Node: Getopt Function687419
-Ref: Getopt Function-Footnote-1702631
-Node: Passwd Functions702831
-Ref: Passwd Functions-Footnote-1711670
-Node: Group Functions711758
-Ref: Group Functions-Footnote-1719656
-Node: Walking Arrays719863
-Node: Library Functions Summary722871
-Node: Library Exercises724277
-Node: Sample Programs724742
-Node: Running Examples725512
-Node: Clones726240
-Node: Cut Program727464
-Node: Egrep Program737393
-Ref: Egrep Program-Footnote-1744905
-Node: Id Program745015
-Node: Split Program748695
-Ref: Split Program-Footnote-1752153
-Node: Tee Program752282
-Node: Uniq Program755072
-Node: Wc Program762693
-Ref: Wc Program-Footnote-1766948
-Node: Miscellaneous Programs767042
-Node: Dupword Program768255
-Node: Alarm Program770285
-Node: Translate Program775140
-Ref: Translate Program-Footnote-1779705
-Node: Labels Program779975
-Ref: Labels Program-Footnote-1783326
-Node: Word Sorting783410
-Node: History Sorting787482
-Node: Extract Program789707
-Node: Simple Sed797761
-Node: Igawk Program800835
-Ref: Igawk Program-Footnote-1815166
-Ref: Igawk Program-Footnote-2815368
-Ref: Igawk Program-Footnote-3815490
-Node: Anagram Program815605
-Node: Signature Program818667
-Node: Programs Summary819914
-Node: Programs Exercises821128
-Ref: Programs Exercises-Footnote-1825257
-Node: Advanced Features825348
-Node: Nondecimal Data827338
-Node: Array Sorting828929
-Node: Controlling Array Traversal829629
-Ref: Controlling Array Traversal-Footnote-1837997
-Node: Array Sorting Functions838115
-Ref: Array Sorting Functions-Footnote-1843206
-Node: Two-way I/O843402
-Ref: Two-way I/O-Footnote-1851123
-Ref: Two-way I/O-Footnote-2851310
-Node: TCP/IP Networking851392
-Node: Profiling854510
-Node: Advanced Features Summary863525
-Node: Internationalization865369
-Node: I18N and L10N866849
-Node: Explaining gettext867536
-Ref: Explaining gettext-Footnote-1873428
-Ref: Explaining gettext-Footnote-2873613
-Node: Programmer i18n873778
-Ref: Programmer i18n-Footnote-1878727
-Node: Translator i18n878776
-Node: String Extraction879570
-Ref: String Extraction-Footnote-1880702
-Node: Printf Ordering880788
-Ref: Printf Ordering-Footnote-1883574
-Node: I18N Portability883638
-Ref: I18N Portability-Footnote-1886094
-Node: I18N Example886157
-Ref: I18N Example-Footnote-1889432
-Ref: I18N Example-Footnote-2889505
-Node: Gawk I18N889614
-Node: I18N Summary890263
-Node: Debugger891604
-Node: Debugging892604
-Node: Debugging Concepts893045
-Node: Debugging Terms894854
-Node: Awk Debugging897429
-Ref: Awk Debugging-Footnote-1898374
-Node: Sample Debugging Session898506
-Node: Debugger Invocation899040
-Node: Finding The Bug900426
-Node: List of Debugger Commands906900
-Node: Breakpoint Control908233
-Node: Debugger Execution Control911927
-Node: Viewing And Changing Data915289
-Node: Execution Stack918830
-Node: Debugger Info920467
-Node: Miscellaneous Debugger Commands924538
-Node: Readline Support929600
-Node: Limitations930496
-Node: Debugging Summary933050
-Node: Namespaces934329
-Node: Global Namespace935440
-Node: Qualified Names936838
-Node: Default Namespace937837
-Node: Changing The Namespace938578
-Node: Naming Rules940192
-Node: Internal Name Management942040
-Node: Namespace Example943082
-Node: Namespace And Features945644
-Node: Namespace Summary947079
-Node: Arbitrary Precision Arithmetic948556
-Node: Computer Arithmetic950043
-Ref: table-numeric-ranges953809
-Ref: table-floating-point-ranges954302
-Ref: Computer Arithmetic-Footnote-1954960
-Node: Math Definitions955017
-Ref: table-ieee-formats958333
-Ref: Math Definitions-Footnote-1958936
-Node: MPFR features959041
-Node: FP Math Caution960759
-Ref: FP Math Caution-Footnote-1961831
-Node: Inexactness of computations962200
-Node: Inexact representation963160
-Node: Comparing FP Values964520
-Node: Errors accumulate965761
-Node: Getting Accuracy967194
-Node: Try To Round969904
-Node: Setting precision970803
-Ref: table-predefined-precision-strings971500
-Node: Setting the rounding mode973330
-Ref: table-gawk-rounding-modes973704
-Ref: Setting the rounding mode-Footnote-1977635
-Node: Arbitrary Precision Integers977814
-Ref: Arbitrary Precision Integers-Footnote-1980989
-Node: Checking for MPFR981138
-Node: POSIX Floating Point Problems982612
-Ref: POSIX Floating Point Problems-Footnote-1986897
-Node: Floating point summary986935
-Node: Dynamic Extensions989125
-Node: Extension Intro990678
-Node: Plugin License991944
-Node: Extension Mechanism Outline992741
-Ref: figure-load-extension993180
-Ref: figure-register-new-function994745
-Ref: figure-call-new-function995837
-Node: Extension API Description997899
-Node: Extension API Functions Introduction999541
-Ref: table-api-std-headers1001377
-Node: General Data Types1005242
-Ref: General Data Types-Footnote-11013603
-Node: Memory Allocation Functions1013902
-Ref: Memory Allocation Functions-Footnote-11018112
-Node: Constructor Functions1018211
-Node: Registration Functions1021797
-Node: Extension Functions1022482
-Node: Exit Callback Functions1027804
-Node: Extension Version String1029054
-Node: Input Parsers1029717
-Node: Output Wrappers1042438
-Node: Two-way processors1046950
-Node: Printing Messages1049215
-Ref: Printing Messages-Footnote-11050386
-Node: Updating ERRNO1050539
-Node: Requesting Values1051278
-Ref: table-value-types-returned1052015
-Node: Accessing Parameters1052951
-Node: Symbol Table Access1054186
-Node: Symbol table by name1054698
-Ref: Symbol table by name-Footnote-11057722
-Node: Symbol table by cookie1057850
-Ref: Symbol table by cookie-Footnote-11062035
-Node: Cached values1062099
-Ref: Cached values-Footnote-11065635
-Node: Array Manipulation1065788
-Ref: Array Manipulation-Footnote-11066879
-Node: Array Data Types1066916
-Ref: Array Data Types-Footnote-11069574
-Node: Array Functions1069666
-Node: Flattening Arrays1074164
-Node: Creating Arrays1081140
-Node: Redirection API1085907
-Node: Extension API Variables1088740
-Node: Extension Versioning1089451
-Ref: gawk-api-version1089880
-Node: Extension GMP/MPFR Versioning1091611
-Node: Extension API Informational Variables1093239
-Node: Extension API Boilerplate1094312
-Node: Changes from API V11098286
-Node: Finding Extensions1099858
-Node: Extension Example1100417
-Node: Internal File Description1101215
-Node: Internal File Ops1105295
-Ref: Internal File Ops-Footnote-11116645
-Node: Using Internal File Ops1116785
-Ref: Using Internal File Ops-Footnote-11119168
-Node: Extension Samples1119442
-Node: Extension Sample File Functions1120971
-Node: Extension Sample Fnmatch1128620
-Node: Extension Sample Fork1130107
-Node: Extension Sample Inplace1131325
-Node: Extension Sample Ord1134950
-Node: Extension Sample Readdir1135786
-Ref: table-readdir-file-types1136675
-Node: Extension Sample Revout1137742
-Node: Extension Sample Rev2way1138331
-Node: Extension Sample Read write array1139071
-Node: Extension Sample Readfile1141013
-Node: Extension Sample Time1142108
-Node: Extension Sample API Tests1143860
-Node: gawkextlib1144352
-Node: Extension summary1147270
-Node: Extension Exercises1150972
-Node: Language History1152214
-Node: V7/SVR3.11153870
-Node: SVR41156022
-Node: POSIX1157456
-Node: BTL1158837
-Node: POSIX/GNU1159566
-Node: Feature History1165344
-Node: Common Extensions1181663
-Node: Ranges and Locales1182946
-Ref: Ranges and Locales-Footnote-11187562
-Ref: Ranges and Locales-Footnote-21187589
-Ref: Ranges and Locales-Footnote-31187824
-Node: Contributors1188047
-Node: History summary1194044
-Node: Installation1195424
-Node: Gawk Distribution1196368
-Node: Getting1196852
-Node: Extracting1197815
-Node: Distribution contents1199453
-Node: Unix Installation1205933
-Node: Quick Installation1206615
-Node: Shell Startup Files1209029
-Node: Additional Configuration Options1210118
-Node: Configuration Philosophy1212433
-Node: Non-Unix Installation1214802
-Node: PC Installation1215262
-Node: PC Binary Installation1216100
-Node: PC Compiling1216535
-Node: PC Using1217652
-Node: Cygwin1221205
-Node: MSYS1222429
-Node: VMS Installation1223031
-Node: VMS Compilation1223822
-Ref: VMS Compilation-Footnote-11225051
-Node: VMS Dynamic Extensions1225109
-Node: VMS Installation Details1226794
-Node: VMS Running1229047
-Node: VMS GNV1233326
-Node: VMS Old Gawk1234061
-Node: Bugs1234532
-Node: Bug address1235195
-Node: Usenet1238177
-Node: Maintainers1239181
-Node: Other Versions1240366
-Node: Installation summary1247454
-Node: Notes1248663
-Node: Compatibility Mode1249457
-Node: Additions1250239
-Node: Accessing The Source1251164
-Node: Adding Code1252601
-Node: New Ports1258820
-Node: Derived Files1263195
-Ref: Derived Files-Footnote-11268855
-Ref: Derived Files-Footnote-21268890
-Ref: Derived Files-Footnote-31269488
-Node: Future Extensions1269602
-Node: Implementation Limitations1270260
-Node: Extension Design1271470
-Node: Old Extension Problems1272614
-Ref: Old Extension Problems-Footnote-11274132
-Node: Extension New Mechanism Goals1274189
-Ref: Extension New Mechanism Goals-Footnote-11277553
-Node: Extension Other Design Decisions1277742
-Node: Extension Future Growth1279855
-Node: Notes summary1280461
-Node: Basic Concepts1281619
-Node: Basic High Level1282300
-Ref: figure-general-flow1282582
-Ref: figure-process-flow1283267
-Ref: Basic High Level-Footnote-11286568
-Node: Basic Data Typing1286753
-Node: Glossary1290081
-Node: Copying1321966
-Node: GNU Free Documentation License1359509
-Node: Index1384629
+Ref: Options-Footnote-1137435
+Ref: Options-Footnote-2137666
+Node: Other Arguments137691
+Node: Naming Standard Input140998
+Node: Environment Variables142208
+Node: AWKPATH Variable142766
+Ref: AWKPATH Variable-Footnote-1146178
+Ref: AWKPATH Variable-Footnote-2146212
+Node: AWKLIBPATH Variable146583
+Ref: AWKLIBPATH Variable-Footnote-1148280
+Node: Other Environment Variables148655
+Node: Exit Status152476
+Node: Include Files153153
+Node: Loading Shared Libraries156843
+Node: Obsolete158271
+Node: Undocumented158963
+Node: Invoking Summary159260
+Node: Regexp162101
+Node: Regexp Usage163555
+Node: Escape Sequences165592
+Node: Regexp Operators171833
+Node: Regexp Operator Details172318
+Ref: Regexp Operator Details-Footnote-1178750
+Node: Interval Expressions178897
+Ref: Interval Expressions-Footnote-1180318
+Node: Bracket Expressions180416
+Ref: table-char-classes182892
+Node: Leftmost Longest186218
+Node: Computed Regexps187521
+Node: GNU Regexp Operators190948
+Node: Case-sensitivity194685
+Ref: Case-sensitivity-Footnote-1197551
+Ref: Case-sensitivity-Footnote-2197786
+Node: Regexp Summary197894
+Node: Reading Files199360
+Node: Records201629
+Node: awk split records202704
+Node: gawk split records207979
+Ref: gawk split records-Footnote-1212712
+Node: Fields212749
+Node: Nonconstant Fields215490
+Ref: Nonconstant Fields-Footnote-1217726
+Node: Changing Fields217930
+Node: Field Separators223961
+Node: Default Field Splitting226659
+Node: Regexp Field Splitting227777
+Node: Single Character Fields231130
+Node: Command Line Field Separator232190
+Node: Full Line Fields235408
+Ref: Full Line Fields-Footnote-1236930
+Ref: Full Line Fields-Footnote-2236976
+Node: Field Splitting Summary237077
+Node: Constant Size239151
+Node: Fixed width data239883
+Node: Skipping intervening243350
+Node: Allowing trailing data244148
+Node: Fields with fixed data245185
+Node: Splitting By Content246703
+Ref: Splitting By Content-Footnote-1250486
+Node: More CSV250649
+Node: Testing field creation251959
+Node: Multiple Line253584
+Node: Getline259861
+Node: Plain Getline262330
+Node: Getline/Variable264903
+Node: Getline/File266054
+Node: Getline/Variable/File267442
+Ref: Getline/Variable/File-Footnote-1269047
+Node: Getline/Pipe269135
+Node: Getline/Variable/Pipe271839
+Node: Getline/Coprocess272974
+Node: Getline/Variable/Coprocess274241
+Node: Getline Notes274983
+Node: Getline Summary277780
+Ref: table-getline-variants278204
+Node: Read Timeout278952
+Ref: Read Timeout-Footnote-1282858
+Node: Retrying Input282916
+Node: Command-line directories284115
+Node: Input Summary285021
+Node: Input Exercises288193
+Node: Printing288627
+Node: Print290461
+Node: Print Examples291918
+Node: Output Separators294698
+Node: OFMT296715
+Node: Printf298071
+Node: Basic Printf298856
+Node: Control Letters300430
+Node: Format Modifiers305594
+Node: Printf Examples311609
+Node: Redirection314095
+Node: Special FD320936
+Ref: Special FD-Footnote-1324104
+Node: Special Files324178
+Node: Other Inherited Files324795
+Node: Special Network325796
+Node: Special Caveats326656
+Node: Close Files And Pipes327605
+Ref: table-close-pipe-return-values334512
+Ref: Close Files And Pipes-Footnote-1335325
+Ref: Close Files And Pipes-Footnote-2335473
+Node: Nonfatal335625
+Node: Output Summary337963
+Node: Output Exercises339185
+Node: Expressions339864
+Node: Values341052
+Node: Constants341730
+Node: Scalar Constants342421
+Ref: Scalar Constants-Footnote-1344945
+Node: Nondecimal-numbers345195
+Node: Regexp Constants348196
+Node: Using Constant Regexps348722
+Node: Standard Regexp Constants349344
+Node: Strong Regexp Constants352532
+Node: Variables355544
+Node: Using Variables356201
+Node: Assignment Options358111
+Node: Conversion360582
+Node: Strings And Numbers361106
+Ref: Strings And Numbers-Footnote-1364169
+Node: Locale influences conversions364278
+Ref: table-locale-affects367036
+Node: All Operators367654
+Node: Arithmetic Ops368283
+Node: Concatenation370789
+Ref: Concatenation-Footnote-1373636
+Node: Assignment Ops373743
+Ref: table-assign-ops378734
+Node: Increment Ops380047
+Node: Truth Values and Conditions383507
+Node: Truth Values384581
+Node: Typing and Comparison385629
+Node: Variable Typing386449
+Ref: Variable Typing-Footnote-1392912
+Ref: Variable Typing-Footnote-2392984
+Node: Comparison Operators393061
+Ref: table-relational-ops393480
+Node: POSIX String Comparison396975
+Ref: POSIX String Comparison-Footnote-1398670
+Ref: POSIX String Comparison-Footnote-2398809
+Node: Boolean Ops398893
+Ref: Boolean Ops-Footnote-1403375
+Node: Conditional Exp403467
+Node: Function Calls405203
+Node: Precedence409080
+Node: Locales412739
+Node: Expressions Summary414371
+Node: Patterns and Actions416944
+Node: Pattern Overview418064
+Node: Regexp Patterns419741
+Node: Expression Patterns420283
+Node: Ranges424064
+Node: BEGIN/END427172
+Node: Using BEGIN/END427933
+Ref: Using BEGIN/END-Footnote-1430669
+Node: I/O And BEGIN/END430775
+Node: BEGINFILE/ENDFILE433089
+Node: Empty436002
+Node: Using Shell Variables436319
+Node: Action Overview438593
+Node: Statements440918
+Node: If Statement442766
+Node: While Statement444261
+Node: Do Statement446289
+Node: For Statement447437
+Node: Switch Statement450608
+Node: Break Statement453049
+Node: Continue Statement455141
+Node: Next Statement456968
+Node: Nextfile Statement459351
+Node: Exit Statement462003
+Node: Built-in Variables464406
+Node: User-modified465539
+Node: Auto-set473306
+Ref: Auto-set-Footnote-1490113
+Ref: Auto-set-Footnote-2490319
+Node: ARGC and ARGV490375
+Node: Pattern Action Summary494588
+Node: Arrays497018
+Node: Array Basics498347
+Node: Array Intro499191
+Ref: figure-array-elements501166
+Ref: Array Intro-Footnote-1503870
+Node: Reference to Elements503998
+Node: Assigning Elements506462
+Node: Array Example506953
+Node: Scanning an Array508712
+Node: Controlling Scanning511734
+Ref: Controlling Scanning-Footnote-1518190
+Node: Numeric Array Subscripts518506
+Node: Uninitialized Subscripts520690
+Node: Delete522309
+Ref: Delete-Footnote-1525061
+Node: Multidimensional525118
+Node: Multiscanning528213
+Node: Arrays of Arrays529804
+Node: Arrays Summary534572
+Node: Functions536665
+Node: Built-in537703
+Node: Calling Built-in538784
+Node: Numeric Functions540780
+Ref: Numeric Functions-Footnote-1544808
+Ref: Numeric Functions-Footnote-2545456
+Ref: Numeric Functions-Footnote-3545504
+Node: String Functions545776
+Ref: String Functions-Footnote-1569933
+Ref: String Functions-Footnote-2570061
+Ref: String Functions-Footnote-3570309
+Node: Gory Details570396
+Ref: table-sub-escapes572187
+Ref: table-sub-proposed573706
+Ref: table-posix-sub575069
+Ref: table-gensub-escapes576610
+Ref: Gory Details-Footnote-1577433
+Node: I/O Functions577587
+Ref: table-system-return-values584055
+Ref: I/O Functions-Footnote-1586135
+Ref: I/O Functions-Footnote-2586283
+Node: Time Functions586403
+Ref: Time Functions-Footnote-1597074
+Ref: Time Functions-Footnote-2597142
+Ref: Time Functions-Footnote-3597300
+Ref: Time Functions-Footnote-4597411
+Ref: Time Functions-Footnote-5597523
+Ref: Time Functions-Footnote-6597750
+Node: Bitwise Functions598016
+Ref: table-bitwise-ops598610
+Ref: Bitwise Functions-Footnote-1604673
+Ref: Bitwise Functions-Footnote-2604846
+Node: Type Functions605037
+Node: I18N Functions607900
+Node: User-defined609551
+Node: Definition Syntax610363
+Ref: Definition Syntax-Footnote-1616050
+Node: Function Example616121
+Ref: Function Example-Footnote-1619043
+Node: Function Calling619065
+Node: Calling A Function619653
+Node: Variable Scope620611
+Node: Pass By Value/Reference623605
+Node: Function Caveats626249
+Ref: Function Caveats-Footnote-1628296
+Node: Return Statement628416
+Node: Dynamic Typing631395
+Node: Indirect Calls632325
+Ref: Indirect Calls-Footnote-1642577
+Node: Functions Summary642705
+Node: Library Functions645410
+Ref: Library Functions-Footnote-1649017
+Ref: Library Functions-Footnote-2649160
+Node: Library Names649331
+Ref: Library Names-Footnote-1652998
+Ref: Library Names-Footnote-2653221
+Node: General Functions653307
+Node: Strtonum Function654410
+Node: Assert Function657432
+Node: Round Function660758
+Node: Cliff Random Function662298
+Node: Ordinal Functions663314
+Ref: Ordinal Functions-Footnote-1666377
+Ref: Ordinal Functions-Footnote-2666629
+Node: Join Function666839
+Ref: Join Function-Footnote-1668609
+Node: Getlocaltime Function668809
+Node: Readfile Function672551
+Node: Shell Quoting674528
+Node: Data File Management675929
+Node: Filetrans Function676561
+Node: Rewind Function680657
+Node: File Checking682566
+Ref: File Checking-Footnote-1683900
+Node: Empty Files684101
+Node: Ignoring Assigns686080
+Node: Getopt Function687630
+Ref: Getopt Function-Footnote-1702842
+Node: Passwd Functions703042
+Ref: Passwd Functions-Footnote-1711881
+Node: Group Functions711969
+Ref: Group Functions-Footnote-1719867
+Node: Walking Arrays720074
+Node: Library Functions Summary723082
+Node: Library Exercises724488
+Node: Sample Programs724953
+Node: Running Examples725723
+Node: Clones726451
+Node: Cut Program727675
+Node: Egrep Program737604
+Ref: Egrep Program-Footnote-1745116
+Node: Id Program745226
+Node: Split Program748906
+Ref: Split Program-Footnote-1752364
+Node: Tee Program752493
+Node: Uniq Program755283
+Node: Wc Program762904
+Ref: Wc Program-Footnote-1767159
+Node: Miscellaneous Programs767253
+Node: Dupword Program768466
+Node: Alarm Program770496
+Node: Translate Program775351
+Ref: Translate Program-Footnote-1779916
+Node: Labels Program780186
+Ref: Labels Program-Footnote-1783537
+Node: Word Sorting783621
+Node: History Sorting787693
+Node: Extract Program789918
+Node: Simple Sed797972
+Node: Igawk Program801046
+Ref: Igawk Program-Footnote-1815377
+Ref: Igawk Program-Footnote-2815579
+Ref: Igawk Program-Footnote-3815701
+Node: Anagram Program815816
+Node: Signature Program818878
+Node: Programs Summary820125
+Node: Programs Exercises821339
+Ref: Programs Exercises-Footnote-1825468
+Node: Advanced Features825559
+Node: Nondecimal Data827549
+Node: Array Sorting829140
+Node: Controlling Array Traversal829840
+Ref: Controlling Array Traversal-Footnote-1838208
+Node: Array Sorting Functions838326
+Ref: Array Sorting Functions-Footnote-1843417
+Node: Two-way I/O843613
+Ref: Two-way I/O-Footnote-1851334
+Ref: Two-way I/O-Footnote-2851521
+Node: TCP/IP Networking851603
+Node: Profiling854721
+Node: Advanced Features Summary863736
+Node: Internationalization865580
+Node: I18N and L10N867060
+Node: Explaining gettext867747
+Ref: Explaining gettext-Footnote-1873639
+Ref: Explaining gettext-Footnote-2873824
+Node: Programmer i18n873989
+Ref: Programmer i18n-Footnote-1878938
+Node: Translator i18n878987
+Node: String Extraction879781
+Ref: String Extraction-Footnote-1880913
+Node: Printf Ordering880999
+Ref: Printf Ordering-Footnote-1883785
+Node: I18N Portability883849
+Ref: I18N Portability-Footnote-1886305
+Node: I18N Example886368
+Ref: I18N Example-Footnote-1889643
+Ref: I18N Example-Footnote-2889716
+Node: Gawk I18N889825
+Node: I18N Summary890474
+Node: Debugger891815
+Node: Debugging892815
+Node: Debugging Concepts893256
+Node: Debugging Terms895065
+Node: Awk Debugging897640
+Ref: Awk Debugging-Footnote-1898585
+Node: Sample Debugging Session898717
+Node: Debugger Invocation899251
+Node: Finding The Bug900637
+Node: List of Debugger Commands907111
+Node: Breakpoint Control908444
+Node: Debugger Execution Control912138
+Node: Viewing And Changing Data915500
+Node: Execution Stack919041
+Node: Debugger Info920678
+Node: Miscellaneous Debugger Commands924749
+Node: Readline Support929811
+Node: Limitations930707
+Node: Debugging Summary933261
+Node: Namespaces934540
+Node: Global Namespace935651
+Node: Qualified Names937049
+Node: Default Namespace938048
+Node: Changing The Namespace938789
+Node: Naming Rules940403
+Node: Internal Name Management942251
+Node: Namespace Example943293
+Node: Namespace And Features945855
+Node: Namespace Summary947290
+Node: Arbitrary Precision Arithmetic948767
+Node: Computer Arithmetic950254
+Ref: table-numeric-ranges954020
+Ref: table-floating-point-ranges954513
+Ref: Computer Arithmetic-Footnote-1955171
+Node: Math Definitions955228
+Ref: table-ieee-formats958544
+Ref: Math Definitions-Footnote-1959147
+Node: MPFR features959252
+Node: FP Math Caution960970
+Ref: FP Math Caution-Footnote-1962042
+Node: Inexactness of computations962411
+Node: Inexact representation963371
+Node: Comparing FP Values964731
+Node: Errors accumulate965972
+Node: Getting Accuracy967405
+Node: Try To Round970115
+Node: Setting precision971014
+Ref: table-predefined-precision-strings971711
+Node: Setting the rounding mode973541
+Ref: table-gawk-rounding-modes973915
+Ref: Setting the rounding mode-Footnote-1977846
+Node: Arbitrary Precision Integers978025
+Ref: Arbitrary Precision Integers-Footnote-1981200
+Node: Checking for MPFR981349
+Node: POSIX Floating Point Problems982823
+Ref: POSIX Floating Point Problems-Footnote-1987108
+Node: Floating point summary987146
+Node: Dynamic Extensions989336
+Node: Extension Intro990889
+Node: Plugin License992155
+Node: Extension Mechanism Outline992952
+Ref: figure-load-extension993391
+Ref: figure-register-new-function994956
+Ref: figure-call-new-function996048
+Node: Extension API Description998110
+Node: Extension API Functions Introduction999752
+Ref: table-api-std-headers1001588
+Node: General Data Types1005453
+Ref: General Data Types-Footnote-11013814
+Node: Memory Allocation Functions1014113
+Ref: Memory Allocation Functions-Footnote-11018323
+Node: Constructor Functions1018422
+Node: Registration Functions1022008
+Node: Extension Functions1022693
+Node: Exit Callback Functions1028015
+Node: Extension Version String1029265
+Node: Input Parsers1029928
+Node: Output Wrappers1042649
+Node: Two-way processors1047161
+Node: Printing Messages1049426
+Ref: Printing Messages-Footnote-11050597
+Node: Updating ERRNO1050750
+Node: Requesting Values1051489
+Ref: table-value-types-returned1052226
+Node: Accessing Parameters1053162
+Node: Symbol Table Access1054397
+Node: Symbol table by name1054909
+Ref: Symbol table by name-Footnote-11057933
+Node: Symbol table by cookie1058061
+Ref: Symbol table by cookie-Footnote-11062246
+Node: Cached values1062310
+Ref: Cached values-Footnote-11065846
+Node: Array Manipulation1065999
+Ref: Array Manipulation-Footnote-11067090
+Node: Array Data Types1067127
+Ref: Array Data Types-Footnote-11069785
+Node: Array Functions1069877
+Node: Flattening Arrays1074375
+Node: Creating Arrays1081351
+Node: Redirection API1086118
+Node: Extension API Variables1088951
+Node: Extension Versioning1089662
+Ref: gawk-api-version1090091
+Node: Extension GMP/MPFR Versioning1091822
+Node: Extension API Informational Variables1093450
+Node: Extension API Boilerplate1094523
+Node: Changes from API V11098497
+Node: Finding Extensions1100069
+Node: Extension Example1100628
+Node: Internal File Description1101426
+Node: Internal File Ops1105506
+Ref: Internal File Ops-Footnote-11116856
+Node: Using Internal File Ops1116996
+Ref: Using Internal File Ops-Footnote-11119379
+Node: Extension Samples1119653
+Node: Extension Sample File Functions1121182
+Node: Extension Sample Fnmatch1128831
+Node: Extension Sample Fork1130318
+Node: Extension Sample Inplace1131536
+Node: Extension Sample Ord1135161
+Node: Extension Sample Readdir1135997
+Ref: table-readdir-file-types1136886
+Node: Extension Sample Revout1137953
+Node: Extension Sample Rev2way1138542
+Node: Extension Sample Read write array1139282
+Node: Extension Sample Readfile1141224
+Node: Extension Sample Time1142319
+Node: Extension Sample API Tests1144071
+Node: gawkextlib1144563
+Node: Extension summary1147481
+Node: Extension Exercises1151183
+Node: Language History1152425
+Node: V7/SVR3.11154081
+Node: SVR41156233
+Node: POSIX1157667
+Node: BTL1159048
+Node: POSIX/GNU1159777
+Node: Feature History1165555
+Node: Common Extensions1181874
+Node: Ranges and Locales1183157
+Ref: Ranges and Locales-Footnote-11187773
+Ref: Ranges and Locales-Footnote-21187800
+Ref: Ranges and Locales-Footnote-31188035
+Node: Contributors1188258
+Node: History summary1194255
+Node: Installation1195635
+Node: Gawk Distribution1196579
+Node: Getting1197063
+Node: Extracting1198026
+Node: Distribution contents1199664
+Node: Unix Installation1206144
+Node: Quick Installation1206826
+Node: Shell Startup Files1209240
+Node: Additional Configuration Options1210329
+Node: Configuration Philosophy1212644
+Node: Non-Unix Installation1215013
+Node: PC Installation1215473
+Node: PC Binary Installation1216311
+Node: PC Compiling1216746
+Node: PC Using1217863
+Node: Cygwin1221416
+Node: MSYS1222640
+Node: VMS Installation1223242
+Node: VMS Compilation1224033
+Ref: VMS Compilation-Footnote-11225262
+Node: VMS Dynamic Extensions1225320
+Node: VMS Installation Details1227005
+Node: VMS Running1229258
+Node: VMS GNV1233537
+Node: VMS Old Gawk1234272
+Node: Bugs1234743
+Node: Bug address1235406
+Node: Usenet1238388
+Node: Maintainers1239392
+Node: Other Versions1240577
+Node: Installation summary1247665
+Node: Notes1248874
+Node: Compatibility Mode1249668
+Node: Additions1250450
+Node: Accessing The Source1251375
+Node: Adding Code1252812
+Node: New Ports1259031
+Node: Derived Files1263406
+Ref: Derived Files-Footnote-11269066
+Ref: Derived Files-Footnote-21269101
+Ref: Derived Files-Footnote-31269699
+Node: Future Extensions1269813
+Node: Implementation Limitations1270471
+Node: Extension Design1271681
+Node: Old Extension Problems1272825
+Ref: Old Extension Problems-Footnote-11274343
+Node: Extension New Mechanism Goals1274400
+Ref: Extension New Mechanism Goals-Footnote-11277764
+Node: Extension Other Design Decisions1277953
+Node: Extension Future Growth1280066
+Node: Notes summary1280672
+Node: Basic Concepts1281830
+Node: Basic High Level1282511
+Ref: figure-general-flow1282793
+Ref: figure-process-flow1283478
+Ref: Basic High Level-Footnote-11286779
+Node: Basic Data Typing1286964
+Node: Glossary1290292
+Node: Copying1322177
+Node: GNU Free Documentation License1359720
+Node: Index1384840
 
 End Tag Table
 
diff --git a/doc/gawk.texi b/doc/gawk.texi
index d211a91..577a114 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -4094,6 +4094,18 @@ or on the command line.
 Files named with @option{-i} are treated as if they had @samp{@@namespace 
"awk"}
 at their beginning.  @xref{Changing The Namespace}, for more information.
 
+@item @option{-I}
+@itemx @option{--trace}
+@cindex @option{-I} option
+@cindex @option{--trace} option
+@cindex trace, internal instructions
+@cindex instructions, trace of internal
+@cindex op-codes, trace of internal
+Print the internal byte code names as they are executed when running
+the program. The trace is printed to standard error. Each ``op code''
+is preceded by a @code{+}
+sign in the output.
+
 @item @option{-l} @var{ext}
 @itemx @option{--load} @var{ext}
 @cindex @option{-l} option
diff --git a/doc/gawktexi.in b/doc/gawktexi.in
index 4a169b4..73b30c3 100644
--- a/doc/gawktexi.in
+++ b/doc/gawktexi.in
@@ -4004,6 +4004,18 @@ or on the command line.
 Files named with @option{-i} are treated as if they had @samp{@@namespace 
"awk"}
 at their beginning.  @xref{Changing The Namespace}, for more information.
 
+@item @option{-I}
+@itemx @option{--trace}
+@cindex @option{-I} option
+@cindex @option{--trace} option
+@cindex trace, internal instructions
+@cindex instructions, trace of internal
+@cindex op-codes, trace of internal
+Print the internal byte code names as they are executed when running
+the program. The trace is printed to standard error. Each ``op code''
+is preceded by a @code{+}
+sign in the output.
+
 @item @option{-l} @var{ext}
 @itemx @option{--load} @var{ext}
 @cindex @option{-l} option
diff --git a/interpret.h b/interpret.h
index 6137e8e..4de778e 100644
--- a/interpret.h
+++ b/interpret.h
@@ -100,7 +100,13 @@ top:
                }
 #endif
 
-               switch ((op = pc->opcode)) {
+               op = pc->opcode;
+               if (do_itrace) {
+                       fprintf(stderr, "+ %s\n", opcode2str(op));
+                       fflush(stderr);
+               }
+
+               switch (op) {
                case Op_rule:
                        currule = pc->in_rule;   /* for sole use in Op_K_next, 
Op_K_nextfile, Op_K_getline */
                        /* fall through */
diff --git a/main.c b/main.c
index 4f239df..b09b5f4 100644
--- a/main.c
+++ b/main.c
@@ -205,6 +205,7 @@ static const struct option optab[] = {
        { "re-interval",        no_argument,            NULL,   'r' },
        { "sandbox",            no_argument,            NULL,   'S' },
        { "source",             required_argument,      NULL,   'e' },
+       { "trace",              no_argument,            NULL,   'I' },
        { "traditional",        no_argument,            NULL,   'c' },
        { "use-lc-numeric",     no_argument,            & use_lc_numeric, 1 },
        { "version",            no_argument,            & do_version, 'V' },
@@ -601,6 +602,7 @@ usage(int exitval, FILE *fp)
        fputs(_("\t-g\t\t\t--gen-pot\n"), fp);
        fputs(_("\t-h\t\t\t--help\n"), fp);
        fputs(_("\t-i includefile\t\t--include=includefile\n"), fp);
+       fputs(_("\t-I\t\t\t--trace\n"), fp);
        fputs(_("\t-l library\t\t--load=library\n"), fp);
        /*
         * TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
@@ -1519,7 +1521,7 @@ parse_args(int argc, char **argv)
        /*
         * The + on the front tells GNU getopt not to rearrange argv.
         */
-       const char *optlist = 
"+F:f:v:W;bcCd::D::e:E:ghi:l:L::nNo::Op::MPrSstVYZ:";
+       const char *optlist = 
"+F:f:v:W;bcCd::D::e:E:ghi:Il:L::nNo::Op::MPrSstVYZ:";
        int old_optind;
        int c;
        char *scan;
@@ -1614,6 +1616,10 @@ parse_args(int argc, char **argv)
                        (void) add_srcfile(SRC_INC, optarg, srcfiles, NULL, 
NULL);
                        break;
 
+               case 'I':
+                       do_flags |= DO_ITRACE;
+                       break;
+
                case 'l':
                        (void) add_srcfile(SRC_EXTLIB, optarg, srcfiles, NULL, 
NULL);
                        break;
diff --git a/pc/Makefile.tst b/pc/Makefile.tst
index 7da52fd..9f8f579 100644
--- a/pc/Makefile.tst
+++ b/pc/Makefile.tst
@@ -167,7 +167,7 @@ BASIC_TESTS = \
        octsub ofmt ofmta ofmtbig ofmtfidl ofmts ofmtstrnum ofs1 onlynl \
        opasnidx opasnslf \
        paramasfunc1 paramasfunc2 paramdup paramres paramtyp paramuninitglobal \
-       parse1 parsefld parseme pcntplus posix2008sub prdupval prec printf0 \
+       parse1 parsefld parseme pcntplus posix_compare posix2008sub prdupval 
prec printf0 \
        printf1 printfchar prmarscl prmreuse prt1eval prtoeval \
        rand randtest range1 range2 readbuf rebrackloc rebt8b1 rebuild redfilnm 
regeq \
        regexpbrack regexpbrack2 regexprange regrange reindops reparse resplit \
@@ -267,7 +267,7 @@ NEED_MPFR = mpfrbigint mpfrbigint2 mpfrexprange mpfrfield 
mpfrieee mpfrmemok1 \
 NEED_NONDEC = mpfrbigint2 nondec2 intarray forcenum
 
 # List of tests that need --posix
-NEED_POSIX = escapebrace printf0 posix2008sub paramasfunc1 paramasfunc2 
muldimposix
+NEED_POSIX = escapebrace printf0 posix2008sub paramasfunc1 paramasfunc2 
muldimposix posix_compare
 
 # List of tests that need --pretty-print
 NEED_PRETTY = nsprof1 nsprof2 \
@@ -305,8 +305,9 @@ NEED_LOCALE_C = \
 
 NEED_LOCALE_EN = \
        backbigs1 backsmalls1 backsmalls2 concat4 dfamb1 ignrcas2 lc_num1 \
-       mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 printhuge reint2 \
-       rri1 subamp subi18n wideidx wideidx2 widesub widesub2 widesub3 widesub4
+       mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 posix_compare \
+       printhuge reint2 rri1 subamp subi18n wideidx wideidx2 \
+       widesub widesub2 widesub3 widesub4
 
 
 # Unused at the moment, since nlstringtest has additional stufff it does
@@ -2027,6 +2028,12 @@ pcntplus:
        @AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? 
>>_$@
        @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
 
+posix_compare:
+       @echo $@
+       @[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+       AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
+       @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
 posix2008sub:
        @echo $@
        @AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
diff --git a/test/ChangeLog b/test/ChangeLog
index bf03353..a85ef93 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -2,6 +2,10 @@
 
        * Makefile.am (EXTRA_DIST): New test, posix_compare.
        * posix_compare.awk, posix_compare.ok: New files.
+       
+       Unrelated:
+
+       * badargs.ok: Updated after code changes.
 
 2020-06-29         Arnold D. Robbins     <arnold@skeeve.com>
 
diff --git a/test/badargs.ok b/test/badargs.ok
index dfbd1c1..5ec0558 100644
--- a/test/badargs.ok
+++ b/test/badargs.ok
@@ -16,6 +16,7 @@ Short options:                GNU long options: (extensions)
        -g                      --gen-pot
        -h                      --help
        -i includefile          --include=includefile
+       -I                      --trace
        -l library              --load=library
        -L[fatal|invalid|no-ext]        --lint[=fatal|invalid|no-ext]
        -M                      --bignum

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=85da96b705877b4a10b0a96b3d9722536674b2d0

commit 85da96b705877b4a10b0a96b3d9722536674b2d0
Author: Arnold D. Robbins <arnold@skeeve.com>
Date:   Thu Jul 2 10:00:30 2020 +0300

    Fix posix_compare function, add test.

diff --git a/ChangeLog b/ChangeLog
index 26dfd0e..eac3a12 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2020-07-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+       * eval.c (posix_compare): Rewrite contributed by
+       Michael Builov <mbuilov@gmail.com>.
+
 2020-06-29         Arnold D. Robbins     <arnold@skeeve.com>
 
        * debug.c: Cleanup messages. Error messages start with lower
diff --git a/eval.c b/eval.c
index c6c37b8..a66eaf3 100644
--- a/eval.c
+++ b/eval.c
@@ -503,79 +503,81 @@ genflags2str(int flagval, const struct flagtab *tab)
 static int
 posix_compare(NODE *s1, NODE *s2)
 {
-       int ret = 0;
-       char save1, save2;
-       size_t l = 0;
+       int ret;
+
+       if (gawk_mb_cur_max == 1) {
+               char save1, save2;
+               const char *p1, *p2;
 
-       save1 = s1->stptr[s1->stlen];
-       s1->stptr[s1->stlen] = '\0';
+               save1 = s1->stptr[s1->stlen];
+               s1->stptr[s1->stlen] = '\0';
 
-       save2 = s2->stptr[s2->stlen];
-       s2->stptr[s2->stlen] = '\0';
+               save2 = s2->stptr[s2->stlen];
+               s2->stptr[s2->stlen] = '\0';
 
-       if (gawk_mb_cur_max == 1) {
-               if (strlen(s1->stptr) == s1->stlen && strlen(s2->stptr) == 
s2->stlen)
-                       ret = strcoll(s1->stptr, s2->stptr);
-               else {
-                       char b1[2], b2[2];
-                       char *p1, *p2;
-                       size_t i;
-
-                       if (s1->stlen < s2->stlen)
-                               l = s1->stlen;
-                       else
-                               l = s2->stlen;
-
-                       b1[1] = b2[1] = '\0';
-                       for (i = ret = 0, p1 = s1->stptr, p2 = s2->stptr;
-                            ret == 0 && i < l;
-                            p1++, p2++) {
-                               b1[0] = *p1;
-                               b2[0] = *p2;
-                               ret = strcoll(b1, b2);
+               p1 = s1->stptr;
+               p2 = s2->stptr;
+
+               for (;;) {
+                       size_t len;
+
+                       ret = strcoll(p1, p2);
+                       if (ret != 0)
+                               break;
+
+                       len = strlen(p1);
+                       p1 += len + 1;
+                       p2 += len + 1;
+
+                       if (p1 == s1->stptr + s1->stlen + 1) {
+                               if (p2 != s2->stptr + s2->stlen + 1)
+                                       ret = -1;
+                               break;
+                       }
+                       if (p2 == s2->stptr + s2->stlen + 1) {
+                               ret = 1;
+                               break;
                        }
                }
-               /*
-                * Either worked through the strings or ret != 0.
-                * In either case, ret will be the right thing to return.
-                */
+
+               s1->stptr[s1->stlen] = save1;
+               s2->stptr[s2->stlen] = save2;
        }
 #if ! defined(__DJGPP__)
        else {
                /* Similar logic, using wide characters */
+               const wchar_t *p1, *p2;
+
                (void) force_wstring(s1);
                (void) force_wstring(s2);
 
-               if (wcslen(s1->wstptr) == s1->wstlen && wcslen(s2->wstptr) == 
s2->wstlen)
-                       ret = wcscoll(s1->wstptr, s2->wstptr);
-               else {
-                       wchar_t b1[2], b2[2];
-                       wchar_t *p1, *p2;
-                       size_t i;
-
-                       if (s1->wstlen < s2->wstlen)
-                               l = s1->wstlen;
-                       else
-                               l = s2->wstlen;
-
-                       b1[1] = b2[1] = L'\0';
-                       for (i = ret = 0, p1 = s1->wstptr, p2 = s2->wstptr;
-                            ret == 0 && i < l;
-                            p1++, p2++) {
-                               b1[0] = *p1;
-                               b2[0] = *p2;
-                               ret = wcscoll(b1, b2);
+               p1 = s1->wstptr;
+               p2 = s2->wstptr;
+
+               for (;;) {
+                       size_t len;
+
+                       ret = wcscoll(p1, p2);
+                       if (ret != 0)
+                               break;
+
+                       len = wcslen(p1);
+                       p1 += len + 1;
+                       p2 += len + 1;
+
+                       if (p1 == s1->wstptr + s1->wstlen + 1) {
+                               if (p2 != s2->wstptr + s2->wstlen + 1)
+                                       ret = -1;
+                               break;
+                       }
+                       if (p2 == s2->wstptr + s2->wstlen + 1) {
+                               ret = 1;
+                               break;
                        }
                }
-               /*
-                * Either worked through the strings or ret != 0.
-                * In either case, ret will be the right thing to return.
-                */
        }
 #endif
 
-       s1->stptr[s1->stlen] = save1;
-       s2->stptr[s2->stlen] = save2;
        return ret;
 }
 
diff --git a/test/ChangeLog b/test/ChangeLog
index 9b04355..bf03353 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2020-07-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+       * Makefile.am (EXTRA_DIST): New test, posix_compare.
+       * posix_compare.awk, posix_compare.ok: New files.
+
 2020-06-29         Arnold D. Robbins     <arnold@skeeve.com>
 
        * dbugeval2.ok, dbugtypedre1.ok, dbugtypedre2.ok, symtab10.ok,
diff --git a/test/Makefile.am b/test/Makefile.am
index 3c241aa..9be24a4 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -905,11 +905,13 @@ EXTRA_DIST = \
        pipeio2.awk \
        pipeio2.in \
        pipeio2.ok \
+       posix2008sub.awk \
+       posix2008sub.ok \
+       posix_compare.awk \
+       posix_compare.ok \
        posix.awk \
        posix.in \
        posix.ok \
-       posix2008sub.awk \
-       posix2008sub.ok \
        poundbang.awk \
        prdupval.awk \
        prdupval.in \
@@ -1366,7 +1368,7 @@ BASIC_TESTS = \
        octsub ofmt ofmta ofmtbig ofmtfidl ofmts ofmtstrnum ofs1 onlynl \
        opasnidx opasnslf \
        paramasfunc1 paramasfunc2 paramdup paramres paramtyp paramuninitglobal \
-       parse1 parsefld parseme pcntplus posix2008sub prdupval prec printf0 \
+       parse1 parsefld parseme pcntplus posix_compare posix2008sub prdupval 
prec printf0 \
        printf1 printfchar prmarscl prmreuse prt1eval prtoeval \
        rand randtest range1 range2 readbuf rebrackloc rebt8b1 rebuild redfilnm 
regeq \
        regexpbrack regexpbrack2 regexprange regrange reindops reparse resplit \
@@ -1467,7 +1469,7 @@ NEED_MPFR = mpfrbigint mpfrbigint2 mpfrexprange mpfrfield 
mpfrieee mpfrmemok1 \
 NEED_NONDEC = mpfrbigint2 nondec2 intarray forcenum
 
 # List of tests that need --posix
-NEED_POSIX = escapebrace printf0 posix2008sub paramasfunc1 paramasfunc2 
muldimposix
+NEED_POSIX = escapebrace printf0 posix2008sub paramasfunc1 paramasfunc2 
muldimposix posix_compare
 
 # List of tests that need --pretty-print
 NEED_PRETTY = nsprof1 nsprof2 \
@@ -1502,8 +1504,9 @@ NEED_LOCALE_C = \
 
 NEED_LOCALE_EN = \
        backbigs1 backsmalls1 backsmalls2 concat4 dfamb1 ignrcas2 lc_num1 \
-       mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 printhuge reint2 \
-       rri1 subamp subi18n wideidx wideidx2 widesub widesub2 widesub3 widesub4
+       mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 posix_compare \
+       printhuge reint2 rri1 subamp subi18n wideidx wideidx2 \
+       widesub widesub2 widesub3 widesub4
 
 # Unused at the moment, since nlstringtest has additional stufff it does
 # NEED_LOCALE_FR =
diff --git a/test/Makefile.in b/test/Makefile.in
index c4b7210..fae611a 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1168,11 +1168,13 @@ EXTRA_DIST = \
        pipeio2.awk \
        pipeio2.in \
        pipeio2.ok \
+       posix2008sub.awk \
+       posix2008sub.ok \
+       posix_compare.awk \
+       posix_compare.ok \
        posix.awk \
        posix.in \
        posix.ok \
-       posix2008sub.awk \
-       posix2008sub.ok \
        poundbang.awk \
        prdupval.awk \
        prdupval.in \
@@ -1629,7 +1631,7 @@ BASIC_TESTS = \
        octsub ofmt ofmta ofmtbig ofmtfidl ofmts ofmtstrnum ofs1 onlynl \
        opasnidx opasnslf \
        paramasfunc1 paramasfunc2 paramdup paramres paramtyp paramuninitglobal \
-       parse1 parsefld parseme pcntplus posix2008sub prdupval prec printf0 \
+       parse1 parsefld parseme pcntplus posix_compare posix2008sub prdupval 
prec printf0 \
        printf1 printfchar prmarscl prmreuse prt1eval prtoeval \
        rand randtest range1 range2 readbuf rebrackloc rebt8b1 rebuild redfilnm 
regeq \
        regexpbrack regexpbrack2 regexprange regrange reindops reparse resplit \
@@ -1729,7 +1731,7 @@ NEED_MPFR = mpfrbigint mpfrbigint2 mpfrexprange mpfrfield 
mpfrieee mpfrmemok1 \
 NEED_NONDEC = mpfrbigint2 nondec2 intarray forcenum
 
 # List of tests that need --posix
-NEED_POSIX = escapebrace printf0 posix2008sub paramasfunc1 paramasfunc2 
muldimposix
+NEED_POSIX = escapebrace printf0 posix2008sub paramasfunc1 paramasfunc2 
muldimposix posix_compare
 
 # List of tests that need --pretty-print
 NEED_PRETTY = nsprof1 nsprof2 \
@@ -1767,8 +1769,9 @@ NEED_LOCALE_C = \
 
 NEED_LOCALE_EN = \
        backbigs1 backsmalls1 backsmalls2 concat4 dfamb1 ignrcas2 lc_num1 \
-       mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 printhuge reint2 \
-       rri1 subamp subi18n wideidx wideidx2 widesub widesub2 widesub3 widesub4
+       mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 posix_compare \
+       printhuge reint2 rri1 subamp subi18n wideidx wideidx2 \
+       widesub widesub2 widesub3 widesub4
 
 
 # Unused at the moment, since nlstringtest has additional stufff it does
@@ -3672,6 +3675,12 @@ pcntplus:
        @AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? 
>>_$@
        @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
 
+posix_compare:
+       @echo $@
+       @[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+       AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
+       @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
 posix2008sub:
        @echo $@
        @AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 1c54a7c..f7aaa15 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -798,6 +798,12 @@ pcntplus:
        @AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? 
>>_$@
        @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
 
+posix_compare:
+       @echo $@
+       @[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+       AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
+       @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
 posix2008sub:
        @echo $@
        @AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT 
CODE: $$? >>_$@
diff --git a/test/posix_compare.awk b/test/posix_compare.awk
new file mode 100644
index 0000000..dcef124
--- /dev/null
+++ b/test/posix_compare.awk
@@ -0,0 +1,47 @@
+function print_str(str,                i, n, chars, result)
+{
+       n = split(str, chars, "")
+       result = ""
+       for (i = 1; i <= n; i++) {
+               if (chars[i] == "\0")
+                       result = result "\\0"
+               else
+                       result = result chars[i]
+       }
+
+       return result
+}
+
+function do_compare(left, comp, right)
+{
+       if (comp == "<")
+               return left < right ? "TRUE" : "FALSE"
+
+       return left > right ? "TRUE" : "FALSE"
+}
+
+
+BEGIN {
+       left[1]  = "abc\0z1";  compare[1]  = "<"; right[1]  = "abc\0z2";  
expected[1]  = "TRUE"
+       left[2]  = "abc\0z2";  compare[2]  = "<"; right[2]  = "abc\0z2";  
expected[2]  = "FALSE"
+       left[3]  = "abc\0z3";  compare[3]  = "<"; right[3]  = "abc\0z2";  
expected[3]  = "FALSE"
+       left[4]  = "abc\0z1";  compare[4]  = ">"; right[4]  = "abc\0z2";  
expected[4]  = "FALSE"
+       left[5]  = "abc\0z2";  compare[5]  = ">"; right[5]  = "abc\0z2";  
expected[5]  = "FALSE"
+       left[6]  = "abc\0z3";  compare[6]  = ">"; right[6]  = "abc\0z2";  
expected[6]  = "TRUE"
+       left[7]  = "abc\0z1";  compare[7]  = "<"; right[7]  = "abc\0z21"; 
expected[7]  = "TRUE"
+       left[8]  = "abc\0z2";  compare[8]  = "<"; right[8]  = "abc\0z21"; 
expected[8]  = "TRUE"
+       left[9]  = "abc\0z3";  compare[9]  = "<"; right[9]  = "abc\0z21"; 
expected[9]  = "FALSE"
+       left[10] = "abc\0z11"; compare[10] = ">"; right[10] = "abc\0z2";  
expected[10] = "FALSE"
+       left[11] = "abc\0z21"; compare[11] = ">"; right[11] = "abc\0z2";  
expected[11] = "TRUE"
+       left[12] = "abc\0z31"; compare[12] = ">"; right[12] = "abc\0z2";  
expected[12] = "TRUE"
+
+       l = 12
+       for (i = 1; i <= l; i++) {
+               result = do_compare(left[i], compare[i], right[i])
+               lstr = print_str(left[i])
+               rstr = print_str(right[i])
+
+               printf("\"%s\" %s \"%s\": Expecting %s: Got %s\n",
+                      lstr, compare[i], rstr, expected[i], result)
+       }
+}
diff --git a/test/posix_compare.ok b/test/posix_compare.ok
new file mode 100644
index 0000000..58dee56
--- /dev/null
+++ b/test/posix_compare.ok
@@ -0,0 +1,12 @@
+"abc\0z1" < "abc\0z2": Expecting TRUE: Got TRUE
+"abc\0z2" < "abc\0z2": Expecting FALSE: Got FALSE
+"abc\0z3" < "abc\0z2": Expecting FALSE: Got FALSE
+"abc\0z1" > "abc\0z2": Expecting FALSE: Got FALSE
+"abc\0z2" > "abc\0z2": Expecting FALSE: Got FALSE
+"abc\0z3" > "abc\0z2": Expecting TRUE: Got TRUE
+"abc\0z1" < "abc\0z21": Expecting TRUE: Got TRUE
+"abc\0z2" < "abc\0z21": Expecting TRUE: Got TRUE
+"abc\0z3" < "abc\0z21": Expecting FALSE: Got FALSE
+"abc\0z11" > "abc\0z2": Expecting FALSE: Got FALSE
+"abc\0z21" > "abc\0z2": Expecting TRUE: Got TRUE
+"abc\0z31" > "abc\0z2": Expecting TRUE: Got TRUE

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

Summary of changes:
 ChangeLog              |   13 +
 NEWS                   |    3 +
 awk.h                  |    4 +-
 doc/ChangeLog          |    4 +
 doc/gawk.1             |   13 +-
 doc/gawk.info          | 1239 ++++++++++++++++++++++++------------------------
 doc/gawk.texi          |   12 +
 doc/gawktexi.in        |   12 +
 eval.c                 |  114 ++---
 interpret.h            |    8 +-
 main.c                 |    8 +-
 pc/Makefile.tst        |   15 +-
 test/ChangeLog         |    9 +
 test/Makefile.am       |   15 +-
 test/Makefile.in       |   21 +-
 test/Maketests         |    6 +
 test/badargs.ok        |    1 +
 test/posix_compare.awk |   47 ++
 test/posix_compare.ok  |   12 +
 19 files changed, 866 insertions(+), 690 deletions(-)
 create mode 100644 test/posix_compare.awk
 create mode 100644 test/posix_compare.ok


hooks/post-receive
-- 
gawk



reply via email to

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