gawk-diffs
[Top][All Lists]
Advanced

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

[gawk-diffs] [SCM] gawk branch, gawk-4.2-stable, updated. gawk-4.1.0-284


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, gawk-4.2-stable, updated. gawk-4.1.0-2849-gaed04bc
Date: Sun, 17 Dec 2017 13:45:13 -0500 (EST)

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-4.2-stable has been updated
       via  aed04bc4eda042bfa80d57a84c7d1406782ee66f (commit)
      from  8db83f48914bb060de8f217ba950d8ee4f5ea5f7 (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=aed04bc4eda042bfa80d57a84c7d1406782ee66f

commit aed04bc4eda042bfa80d57a84c7d1406782ee66f
Author: Arnold D. Robbins <address@hidden>
Date:   Sun Dec 17 20:44:53 2017 +0200

    Update doc with lots of formatting improvements.

diff --git a/awklib/eg/lib/bits2str.awk b/awklib/eg/lib/bits2str.awk
index a10ffad..5dddc1c 100644
--- a/awklib/eg/lib/bits2str.awk
+++ b/awklib/eg/lib/bits2str.awk
@@ -1,4 +1,4 @@
-# bits2str --- turn a byte into readable ones and zeros
+# bits2str --- turn an integer into readable ones and zeros
 
 function bits2str(bits,        data, mask)
 {
diff --git a/awklib/eg/prog/split.awk b/awklib/eg/prog/split.awk
index b878fa5..9239a6c 100644
--- a/awklib/eg/prog/split.awk
+++ b/awklib/eg/prog/split.awk
@@ -27,7 +27,6 @@ BEGIN {
         outfile = ARGV[i]
         ARGV[i] = ""
     }
-
     s1 = s2 = "a"
     out = (outfile s1 s2)
 }
diff --git a/awklib/eg/prog/testbits.awk b/awklib/eg/prog/testbits.awk
index 143cd91..03cb716 100644
--- a/awklib/eg/prog/testbits.awk
+++ b/awklib/eg/prog/testbits.awk
@@ -1,4 +1,4 @@
-# bits2str --- turn a byte into readable 1's and 0's
+# bits2str --- turn an integer into readable ones and zeros
 
 function bits2str(bits,        data, mask)
 {
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 944da8f..d73f939 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,15 @@
+2017-12-01         Sergey Tselikh     <address@hidden>
+
+       * gawktexi.in: Several small changes to gawktexi.in,
+       mainly related to fixing typos, small text polishing
+       and adding @group/@end group in @example and @example-like
+       constructs to clean PDF version (formatted for Letter paper,
+       which is the default) of orphaned single lines of source code
+       or example output in higher and lower parts of pages (such
+       lines were with just a "}", or with a single line of code or
+       a comment).  Hyphenated words "single-precision",
+       "double-precision" and alike left untouched.
+
 2017-12-14         Arnold D. Robbins     <address@hidden>
 
        * gawktexi.in: Add a note to add a section on recursion.
diff --git a/doc/gawk.info b/doc/gawk.info
index 431d504..e93b4d3 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -7383,13 +7383,13 @@ from the system's 'close()' or 'fclose()' C functions 
when closing input
 or output files, respectively.  This value is zero if the close
 succeeds, or -1 if it fails.
 
-Situation                     Return value from 'close()'
+Situation                            Return value from 'close()'
 --------------------------------------------------------------------------
-Normal exit of command        Command's exit status
-Death by signal of command    256 + number of murderous signal
-Death by signal of command    512 + number of murderous signal
-with core dump
-Some kind of error            -1
+Normal exit of command               Command's exit status
+Death by signal of command           256 + number of murderous signal
+Death by signal of command with      512 + number of murderous signal
+core dump
+Some kind of error                   -1
 
 Table 5.1: Return values from 'close()' of a pipe
 
@@ -7422,7 +7422,8 @@ file, or some other I/O error (such as filling up the 
disk) is a fatal
 error.
 
      $ gawk 'BEGIN { print "hi" > "/no/such/file" }'
-     error-> gawk: cmd. line:1: fatal: can't redirect to `/no/such/file' (No 
such file or directory)
+     error-> gawk: cmd. line:1: fatal: can't redirect to `/no/such/file' (No
+     error-> such file or directory)
 
    'gawk' makes it possible to detect that an error has occurred,
 allowing you to possibly recover from the error, or at least print an
@@ -13288,35 +13289,34 @@ parameters are enclosed in square brackets ([ ]):
 
               Interactive Versus Noninteractive Buffering
 
-     As a side point, buffering issues can be even more confusing if
-     your program is "interactive" (i.e., communicating with a user
-     sitting at a keyboard).(1)
+   As a side point, buffering issues can be even more confusing if your
+program is "interactive" (i.e., communicating with a user sitting at a
+keyboard).(1)
 
-     Interactive programs generally "line buffer" their output (i.e.,
-     they write out every line).  Noninteractive programs wait until
-     they have a full buffer, which may be many lines of output.  Here
-     is an example of the difference:
+   Interactive programs generally "line buffer" their output (i.e., they
+write out every line).  Noninteractive programs wait until they have a
+full buffer, which may be many lines of output.  Here is an example of
+the difference:
 
-          $ awk '{ print $1 + $2 }'
-          1 1
-          -| 2
-          2 3
-          -| 5
-          Ctrl-d
+     $ awk '{ print $1 + $2 }'
+     1 1
+     -| 2
+     2 3
+     -| 5
+     Ctrl-d
 
-     Each line of output is printed immediately.  Compare that behavior
-     with this example:
+Each line of output is printed immediately.  Compare that behavior with
+this example:
 
-          $ awk '{ print $1 + $2 }' | cat
-          1 1
-          2 3
-          Ctrl-d
-          -| 2
-          -| 5
+     $ awk '{ print $1 + $2 }' | cat
+     1 1
+     2 3
+     Ctrl-d
+     -| 2
+     -| 5
 
-     Here, no output is printed until after the 'Ctrl-d' is typed,
-     because it is all buffered and sent down the pipe to 'cat' in one
-     shot.
+Here, no output is printed until after the 'Ctrl-d' is typed, because it
+is all buffered and sent down the pipe to 'cat' in one shot.
 
 'system(COMMAND)'
      Execute the operating system command COMMAND and then return to the
@@ -13814,7 +13814,7 @@ are enclosed in square brackets ([ ]):
    Here is a user-defined function (*note User-defined::) that
 illustrates the use of these functions:
 
-     # bits2str --- turn a byte into readable ones and zeros
+     # bits2str --- turn an integer into readable ones and zeros
 
      function bits2str(bits,        data, mask)
      {
@@ -13849,7 +13849,8 @@ This program produces the following output when run:
      -| 123 = 01111011
      -| 0123 = 01010011
      -| 0x99 = 10011001
-     -| compl(0x99) = 0x3fffffffffff66 = 
00111111111111111111111111111111111111111111111101100110
+     -| compl(0x99) = 0x3fffffffffff66 =
+     -| 00111111111111111111111111111111111111111111111101100110
      -| lshift(0x99, 2) = 0x264 = 0000001001100100
      -| rshift(0x99, 2) = 0x26 = 00100110
 
@@ -15417,7 +15418,6 @@ following function does traditional rounding; it might 
be useful if your
               return ival
         }
      }
-
      # test harness
      # { print $0, round($0) }
 
@@ -17743,7 +17743,6 @@ names:
              outfile = ARGV[i]
              ARGV[i] = ""
          }
-
          s1 = s2 = "a"
          out = (outfile s1 s2)
      }
@@ -19994,6 +19993,7 @@ specific field position and can be used for this 
purpose:
          PROCINFO["sorted_in"] = "cmp_field"
          if (POS < 1 || POS > NF)
              POS = 1
+
          for (i in a) {
              for (j = 1; j <= NF; j++)
                  printf("%s%c", a[i][j], j < NF ? ":" : "")
@@ -22313,9 +22313,7 @@ categories, as follows:
           -| [   :0xfcc660] Op_no_op          :
           -| [  1:0xfcc520] Op_assign_concat  : c
           -| [   :0xfcc620] Op_jmp            : [target_jmp = 0xfcc440]
-          -|
           ...
-          -|
           -| [     2:0xfcc5a0] Op_K_printf         : [expr_count = 17] 
[redir_type = ""]
           -| [      :0xfcc140] Op_no_op            :
           -| [      :0xfcc1c0] Op_atexit           :
@@ -22581,11 +22579,14 @@ Floating-point arithmetic
    Computers work with integer and floating-point values of different
 ranges.  Integer values are usually either 32 or 64 bits in size.
 Single-precision floating-point values occupy 32 bits, whereas
-double-precision floating-point values occupy 64 bits.  Floating-point
+double-precision floating-point values occupy 64 bits.
+(Quadruple-precision floating point values also exist.  They occupy 128
+bits, but such numbers are not available in 'awk'.)  Floating-point
 values are always signed.  The possible ranges of values are shown in
-*note Table 15.1: table-numeric-ranges.
+*note Table 15.1: table-numeric-ranges. and *note Table 15.2:
+table-floating-point-ranges.
 
-Numeric representation   Minimum value            Maximum value
+Representation           Minimum value            Maximum value
 ---------------------------------------------------------------------------
 32-bit signed integer    -2,147,483,648           2,147,483,647
 32-bit unsigned          0                        4,294,967,295
@@ -22593,14 +22594,22 @@ integer
 64-bit signed integer    -9,223,372,036,854,775,8089,223,372,036,854,775,807
 64-bit unsigned          0                        18,446,744,073,709,551,615
 integer
-Single-precision         1.175494e-38             3.402823e38
-floating point
-(approximate)
-Double-precision         2.225074e-308            1.797693e308
-floating point
-(approximate)
 
-Table 15.1: Value ranges for different numeric representations
+Table 15.1: Value ranges for integer representations
+
+Representation              Minimum          Minimum finite   Maximum finite
+                            positive         value            value
+                            nonzero value
+--------------------------------------------------------------------------------
+Single-precision            1.175494e-38     -3.402823e+38    3.402823e+38
+floating-point
+Double-precision            2.225074e-308    -1.797693e+308   1.797693e+308
+floating-point
+Quadruple-precision         3.362103e-4932   -1.189731e+4932  1.189731e+4932
+floating-point
+
+Table 15.2: Approximate value ranges for floating-point number
+representations
 
    ---------- Footnotes ----------
 
@@ -22689,7 +22698,7 @@ IEEE 754 types are 32-bit single precision, 64-bit 
double precision, and
 precision formats to allow greater precisions and larger exponent
 ranges.  ('awk' uses only the 64-bit double-precision format.)
 
-   *note Table 15.2: table-ieee-formats. lists the precision and
+   *note Table 15.3: table-ieee-formats. lists the precision and
 exponent field values for the basic IEEE 754 binary formats.
 
 Name           Total bits     Precision      Minimum        Maximum
@@ -22699,7 +22708,7 @@ Single         32             24             -126       
    +127
 Double         64             53             -1022          +1023
 Quadruple      128            113            -16382         +16383
 
-Table 15.2: Basic IEEE format values
+Table 15.3: Basic IEEE format values
 
      NOTE: The precision numbers include the implied leading one that
      gives them one extra bit of significand.
@@ -23010,7 +23019,7 @@ operation or calling a built-in function rounds the 
result to the
 current working precision.  The default working precision is 53 bits,
 which you can modify using the predefined variable 'PREC'.  You can also
 set the value to one of the predefined case-insensitive strings shown in
-*note Table 15.3: table-predefined-precision-strings, to emulate an IEEE
+*note Table 15.4: table-predefined-precision-strings, to emulate an IEEE
 754 binary format.
 
 'PREC'       IEEE 754 binary format
@@ -23021,7 +23030,7 @@ set the value to one of the predefined case-insensitive 
strings shown in
 '"quad"'     Basic 128-bit quadruple precision
 '"oct"'      256-bit octuple precision
 
-Table 15.3: Predefined precision strings for 'PREC'
+Table 15.4: Predefined precision strings for 'PREC'
 
    The following example illustrates the effects of changing precision
 on arithmetic operations:
@@ -23063,7 +23072,7 @@ File: gawk.info,  Node: Setting the rounding mode,  
Prev: Setting precision,  Up
 
 The 'ROUNDMODE' variable provides program-level control over the
 rounding mode.  The correspondence between 'ROUNDMODE' and the IEEE
-rounding modes is shown in *note Table 15.4: table-gawk-rounding-modes.
+rounding modes is shown in *note Table 15.5: table-gawk-rounding-modes.
 
 Rounding mode                    IEEE name              'ROUNDMODE'
 ---------------------------------------------------------------------------
@@ -23073,10 +23082,10 @@ Round toward negative infinity   
'roundTowardNegative'  '"D"' or '"d"'
 Round toward zero                'roundTowardZero'      '"Z"' or '"z"'
 Round away from zero                                    '"A"' or '"a"'
 
-Table 15.4: 'gawk' rounding modes
+Table 15.5: 'gawk' rounding modes
 
    'ROUNDMODE' has the default value '"N"', which selects the IEEE 754
-rounding mode 'roundTiesToEven'.  In *note Table 15.4:
+rounding mode 'roundTiesToEven'.  In *note Table 15.5:
 table-gawk-rounding-modes, the value '"A"' selects rounding away from
 zero.  This is only available if your version of the MPFR library
 supports it; otherwise, setting 'ROUNDMODE' to '"A"' has no effect.
@@ -24023,6 +24032,8 @@ value:
           strcpy(message, greet);
           make_malloced_string(message, strlen(message), & result);
 
+
+
 '#define ezalloc(pointer, type, size, message) ...'
      This is like 'emalloc()', but it calls 'gawk_calloc()' instead of
      'gawk_malloc()'.  The arguments are the same as for the 'emalloc()'
@@ -25616,7 +25627,7 @@ array:
 
    Here is the result of running the script:
 
-     $ AWKLIBPATH=$PWD ./gawk -f subarray.awk
+     $ AWKLIBPATH=$PWD gawk -f subarray.awk
      -| new_array["subarray"]["foo"] = bar
      -| new_array["hello"] = world
      -| new_array["answer"] = 42
@@ -25751,7 +25762,7 @@ are included in the API 'struct' as read-only constant 
integers:
    It is up to the extension to decide if there are API
 incompatibilities.  Typically, a check like this is enough:
 
-     if (api->major_version != GAWK_API_MAJOR_VERSION
+     if (   api->major_version != GAWK_API_MAJOR_VERSION
          || api->minor_version < GAWK_API_MINOR_VERSION) {
              fprintf(stderr, "foo_extension: version mismatch with gawk!\n");
              fprintf(stderr, "\tmy version (%d, %d), gawk version (%d, %d)\n",
@@ -26317,7 +26328,7 @@ table to map file types to strings:
      #endif
      #ifdef S_IFDOOR /* Solaris weirdness */
              { S_IFDOOR, "door" },
-     #endif /* S_IFDOOR */
+     #endif
          };
          int j, k;
 
@@ -26356,7 +26367,7 @@ and/or the type of the file.  It then returns zero, for 
success:
 
      #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
          array_set_numeric(array, "blksize", sbuf->st_blksize);
-     #endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
+     #endif
 
          pmode = format_mode(sbuf->st_mode);
          array_set(array, "pmode", make_const_string(pmode, strlen(pmode),
@@ -31027,7 +31038,7 @@ Compiler
 Complemented Bracket Expression
      The negation of a "bracket expression".  All that is _not_
      described by a given bracket expression.  The symbol '^' precedes
-     the negated bracket expression.  E.g.: '[[^:digit:]' designates
+     the negated bracket expression.  E.g.: '[^[:digit:]]' designates
      whatever character is not a digit.  '[^bad]' designates whatever
      character is not one of the letters 'b', 'a', or 'd'.  See "Bracket
      Expression."
@@ -31282,7 +31293,7 @@ Keyword
      names.
 
      'gawk''s keywords are: 'BEGIN', 'BEGINFILE', 'END', 'ENDFILE',
-     'break', 'case', 'continue', 'default' 'delete', 'do...while',
+     'break', 'case', 'continue', 'default', 'delete', 'do...while',
      'else', 'exit', 'for...in', 'for', 'function', 'func', 'if',
      'next', 'nextfile', 'switch', and 'while'.
 
@@ -32893,7 +32904,7 @@ Index
 * --re-interval option:                  Options.             (line 292)
 * --sandbox option:                      Options.             (line 304)
 * --sandbox option, disabling system() function: I/O Functions.
-                                                              (line 129)
+                                                              (line 128)
 * --sandbox option, input redirection with getline: Getline.  (line  19)
 * --sandbox option, output redirection with print, printf: Redirection.
                                                               (line   6)
@@ -33136,6 +33147,7 @@ Index
                                                               (line   6)
 * arbitrary precision integers:          Arbitrary Precision Integers.
                                                               (line   6)
+* arbitrary-precision:                   Computer Arithmetic. (line  61)
 * archaeologists:                        Bugs.                (line   6)
 * arctangent:                            Numeric Functions.   (line  12)
 * ARGC/ARGV variables:                   Auto-set.            (line  15)
@@ -33460,11 +33472,11 @@ Index
 * Buening, Andreas:                      Acknowledgments.     (line  60)
 * Buening, Andreas <1>:                  Contributors.        (line  95)
 * Buening, Andreas <2>:                  Maintainers.         (line  14)
-* buffering, input/output:               I/O Functions.       (line 166)
+* buffering, input/output:               I/O Functions.       (line 165)
 * buffering, input/output <1>:           Two-way I/O.         (line  53)
 * buffering, interactive vs. noninteractive: I/O Functions.   (line  76)
 * buffers, flushing:                     I/O Functions.       (line  32)
-* buffers, flushing <1>:                 I/O Functions.       (line 166)
+* buffers, flushing <1>:                 I/O Functions.       (line 165)
 * buffers, operators for:                GNU Regexp Operators.
                                                               (line  51)
 * bug reports, email address, address@hidden: Bug address.  (line  31)
@@ -33628,9 +33640,9 @@ Index
                                                               (line  31)
 * converting, dates to timestamps:       Time Functions.      (line  78)
 * converting, numbers to strings:        Strings And Numbers. (line   6)
-* converting, numbers to strings <1>:    Bitwise Functions.   (line 108)
+* converting, numbers to strings <1>:    Bitwise Functions.   (line 109)
 * converting, strings to numbers:        Strings And Numbers. (line   6)
-* converting, strings to numbers <1>:    Bitwise Functions.   (line 108)
+* converting, strings to numbers <1>:    Bitwise Functions.   (line 109)
 * CONVFMT variable:                      Strings And Numbers. (line  29)
 * CONVFMT variable <1>:                  User-modified.       (line  30)
 * CONVFMT variable, and array subscripts: Numeric Array Subscripts.
@@ -33763,16 +33775,16 @@ Index
                                                               (line  39)
 * debugger commands, frame:              Execution Stack.     (line  27)
 * debugger commands, h (help):           Miscellaneous Debugger Commands.
-                                                              (line  69)
+                                                              (line  67)
 * debugger commands, help:               Miscellaneous Debugger Commands.
-                                                              (line  69)
+                                                              (line  67)
 * 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  75)
+                                                              (line  73)
 * debugger commands, list:               Miscellaneous Debugger Commands.
-                                                              (line  75)
+                                                              (line  73)
 * debugger commands, n (next):           Debugger Execution Control.
                                                               (line  43)
 * debugger commands, next:               Debugger Execution Control.
@@ -33790,9 +33802,9 @@ Index
 * debugger commands, printf:             Viewing And Changing Data.
                                                               (line  53)
 * debugger commands, q (quit):           Miscellaneous Debugger Commands.
-                                                              (line 102)
+                                                              (line 100)
 * debugger commands, quit:               Miscellaneous Debugger Commands.
-                                                              (line 102)
+                                                              (line 100)
 * debugger commands, r (run):            Debugger Execution Control.
                                                               (line  62)
 * debugger commands, return:             Debugger Execution Control.
@@ -33814,7 +33826,7 @@ Index
 * debugger commands, t (tbreak):         Breakpoint Control.  (line  90)
 * debugger commands, tbreak:             Breakpoint Control.  (line  90)
 * debugger commands, trace:              Miscellaneous Debugger Commands.
-                                                              (line 110)
+                                                              (line 108)
 * debugger commands, u (until):          Debugger Execution Control.
                                                               (line  82)
 * debugger commands, undisplay:          Viewing And Changing Data.
@@ -33955,6 +33967,7 @@ Index
 * dollar sign ($), regexp operator:      Regexp Operators.    (line  35)
 * double quote ("), in regexp constants: Computed Regexps.    (line  30)
 * double quote ("), in shell commands:   Quoting.             (line  54)
+* double-precision:                      Computer Arithmetic. (line  61)
 * down debugger command:                 Execution Stack.     (line  23)
 * Drepper, Ulrich:                       Acknowledgments.     (line  52)
 * Duman, Patrice:                        Acknowledgments.     (line  75)
@@ -34060,14 +34073,14 @@ Index
 * exclamation point (!), !~ operator <7>: Expression Patterns.
                                                               (line  24)
 * exit debugger command:                 Miscellaneous Debugger Commands.
-                                                              (line  66)
+                                                              (line  64)
 * exit statement:                        Exit Statement.      (line   6)
 * exit status, of gawk:                  Exit Status.         (line   6)
 * exit status, of VMS:                   VMS Running.         (line  28)
 * exit the debugger:                     Miscellaneous Debugger Commands.
-                                                              (line  66)
+                                                              (line  64)
 * exit the debugger <1>:                 Miscellaneous Debugger Commands.
-                                                              (line 102)
+                                                              (line 100)
 * exp:                                   Numeric Functions.   (line  19)
 * expand utility:                        Very Simple.         (line  73)
 * Expat XML parser library:              gawkextlib.          (line  37)
@@ -34233,8 +34246,15 @@ Index
 * fixed-width data:                      Constant Size.       (line   6)
 * flag variables:                        Boolean Ops.         (line  69)
 * flag variables <1>:                    Tee Program.         (line  20)
+* floating-point, numbers:               Computer Arithmetic. (line  49)
 * floating-point, numbers, arbitrary precision: Arbitrary Precision Arithmetic.
                                                               (line   6)
+* floating-point, numbers, arbitrary-precision: Computer Arithmetic.
+                                                              (line  61)
+* floating-point, numbers, double-precision: Computer Arithmetic.
+                                                              (line  61)
+* floating-point, numbers, single-precision: Computer Arithmetic.
+                                                              (line  61)
 * floating-point, VAX/VMS:               VMS Running.         (line  50)
 * flush buffered output:                 I/O Functions.       (line  28)
 * fnmatch() extension function:          Extension Sample Fnmatch.
@@ -34535,7 +34555,7 @@ Index
 * Guerrero, Juan Manuel <1>:             Contributors.        (line 150)
 * Guerrero, Juan Manuel <2>:             Maintainers.         (line  14)
 * h debugger command (alias for help):   Miscellaneous Debugger Commands.
-                                                              (line  69)
+                                                              (line  67)
 * Hankerson, Darrel:                     Acknowledgments.     (line  60)
 * Hankerson, Darrel <1>:                 Contributors.        (line  61)
 * Haque, John:                           Contributors.        (line 111)
@@ -34543,7 +34563,7 @@ Index
 * Hartholz, Marshall:                    Acknowledgments.     (line  38)
 * Hasegawa, Isamu:                       Contributors.        (line  97)
 * help debugger command:                 Miscellaneous Debugger Commands.
-                                                              (line  69)
+                                                              (line  67)
 * hexadecimal numbers:                   Nondecimal-numbers.  (line   6)
 * hexadecimal values, enabling interpretation of: Options.    (line 223)
 * history expansion, in debugger:        Readline Support.    (line   6)
@@ -34637,7 +34657,7 @@ Index
 * integers, arbitrary precision:         Arbitrary Precision Integers.
                                                               (line   6)
 * integers, unsigned:                    Computer Arithmetic. (line  41)
-* interacting with other programs:       I/O Functions.       (line 107)
+* interacting with other programs:       I/O Functions.       (line 106)
 * internationalization:                  I18N Functions.      (line   6)
 * internationalization <1>:              I18N and L10N.       (line   6)
 * internationalization, localization:    User-modified.       (line 155)
@@ -34658,7 +34678,7 @@ Index
 * interpreted programs <1>:              Glossary.            (line 443)
 * interval expressions, regexp operator: Regexp Operators.    (line 116)
 * inventory-shipped file:                Sample Data Files.   (line  32)
-* invoke shell command:                  I/O Functions.       (line 107)
+* invoke shell command:                  I/O Functions.       (line 106)
 * isarray:                               Type Functions.      (line  11)
 * ISO:                                   Glossary.            (line 454)
 * ISO 8859-1:                            Glossary.            (line 194)
@@ -34691,7 +34711,7 @@ Index
 * Knights, jedi:                         Undocumented.        (line   6)
 * Kwok, Conrad:                          Contributors.        (line  35)
 * l debugger command (alias for list):   Miscellaneous Debugger Commands.
-                                                              (line  75)
+                                                              (line  73)
 * labels.awk program:                    Labels Program.      (line  51)
 * Langston, Peter:                       Advanced Features.   (line   6)
 * LANGUAGE environment variable:         Explaining gettext.  (line 120)
@@ -34769,7 +34789,7 @@ Index
 * Linux <2>:                             Glossary.            (line 746)
 * list all global variables, in debugger: Debugger Info.      (line  48)
 * list debugger command:                 Miscellaneous Debugger Commands.
-                                                              (line  75)
+                                                              (line  73)
 * list function definitions, in debugger: Debugger Info.      (line  30)
 * loading extensions, @load directive:   Loading Shared Libraries.
                                                               (line   8)
@@ -34910,7 +34930,7 @@ Index
 * null strings, converting numbers to strings: Strings And Numbers.
                                                               (line  21)
 * null strings, matching:                String Functions.    (line 539)
-* number as string of bits:              Bitwise Functions.   (line 108)
+* number as string of bits:              Bitwise Functions.   (line 109)
 * number of array elements:              String Functions.    (line 200)
 * number sign (#), #! (executable scripts): Executable Scripts.
                                                               (line   6)
@@ -34921,7 +34941,7 @@ Index
 * numbers, Cliff random:                 Cliff Random Function.
                                                               (line   6)
 * numbers, converting:                   Strings And Numbers. (line   6)
-* numbers, converting <1>:               Bitwise Functions.   (line 108)
+* numbers, converting <1>:               Bitwise Functions.   (line 109)
 * numbers, converting, to strings:       User-modified.       (line  30)
 * numbers, converting, to strings <1>:   User-modified.       (line 107)
 * numbers, hexadecimal:                  Nondecimal-numbers.  (line   6)
@@ -35004,7 +35024,7 @@ Index
 * output redirection:                    Redirection.         (line   6)
 * output wrapper:                        Output Wrappers.     (line   6)
 * output, buffering:                     I/O Functions.       (line  32)
-* output, buffering <1>:                 I/O Functions.       (line 166)
+* output, buffering <1>:                 I/O Functions.       (line 165)
 * output, duplicating into files:        Tee Program.         (line   6)
 * output, files, closing:                Close Files And Pipes.
                                                               (line   6)
@@ -35228,7 +35248,7 @@ Index
 * programming, concepts <1>:             Basic Concepts.      (line   6)
 * pwcat program:                         Passwd Functions.    (line  23)
 * q debugger command (alias for quit):   Miscellaneous Debugger Commands.
-                                                              (line 102)
+                                                              (line 100)
 * QSE awk:                               Other Versions.      (line 140)
 * Quanstrom, Erik:                       Alarm Program.       (line   8)
 * question mark (?), ?: operator:        Precedence.          (line  91)
@@ -35237,7 +35257,7 @@ Index
                                                               (line  62)
 * QuikTrim Awk:                          Other Versions.      (line 144)
 * quit debugger command:                 Miscellaneous Debugger Commands.
-                                                              (line 102)
+                                                              (line 100)
 * QUIT signal (MS-Windows):              Profiling.           (line 212)
 * quoting in gawk command lines:         Long.                (line  26)
 * quoting in gawk command lines, tricks for: Quoting.         (line  91)
@@ -35494,12 +35514,12 @@ Index
                                                               (line  63)
 * sidebar, Backslash Before Regular Characters: Escape Sequences.
                                                               (line 106)
-* sidebar, Beware The Smoke and Mirrors!: Bitwise Functions.  (line 126)
+* sidebar, Beware The Smoke and Mirrors!: Bitwise Functions.  (line 127)
 * sidebar, Changing FS Does Not Affect the Fields: Full Line Fields.
                                                               (line  14)
 * sidebar, Changing NR and FNR:          Auto-set.            (line 388)
 * sidebar, Controlling Output Buffering with system(): I/O Functions.
-                                                              (line 164)
+                                                              (line 163)
 * sidebar, Escape Sequences for Metacharacters: Escape Sequences.
                                                               (line 138)
 * sidebar, FS and IGNORECASE:            Field Splitting Summary.
@@ -35543,6 +35563,7 @@ Index
 * single quote ('), with double quotes:  Quoting.             (line  73)
 * single-character fields:               Single Character Fields.
                                                               (line   6)
+* single-precision:                      Computer Arithmetic. (line  61)
 * single-step execution, in the debugger: Debugger Execution Control.
                                                               (line  43)
 * Skywalker, Luke:                       Undocumented.        (line   6)
@@ -35625,7 +35646,7 @@ Index
 * string-translation functions:          I18N Functions.      (line   6)
 * strings splitting, example:            String Functions.    (line 336)
 * strings, converting:                   Strings And Numbers. (line   6)
-* strings, converting <1>:               Bitwise Functions.   (line 108)
+* strings, converting <1>:               Bitwise Functions.   (line 109)
 * strings, converting letter case:       String Functions.    (line 525)
 * strings, converting, numbers to:       User-modified.       (line  30)
 * strings, converting, numbers to <1>:   User-modified.       (line 107)
@@ -35665,7 +35686,7 @@ Index
 * SYMTAB array:                          Auto-set.            (line 332)
 * syntactic ambiguity: /= operator vs. /=.../ regexp constant: Assignment Ops.
                                                               (line 149)
-* system:                                I/O Functions.       (line 107)
+* system:                                I/O Functions.       (line 106)
 * systime:                               Time Functions.      (line  68)
 * t debugger command (alias for tbreak): Breakpoint Control.  (line  90)
 * tbreak debugger command:               Breakpoint Control.  (line  90)
@@ -35722,7 +35743,7 @@ Index
 * toupper:                               String Functions.    (line 532)
 * tr utility:                            Translate Program.   (line   6)
 * trace debugger command:                Miscellaneous Debugger Commands.
-                                                              (line 110)
+                                                              (line 108)
 * traceback, display in debugger:        Execution Stack.     (line  13)
 * translate string:                      I18N Functions.      (line  21)
 * translate.awk program:                 Translate Program.   (line  55)
@@ -35756,7 +35777,7 @@ Index
                                                               (line  40)
 * troubleshooting, string concatenation: Concatenation.       (line  27)
 * troubleshooting, substr() function:    String Functions.    (line 502)
-* troubleshooting, system() function:    I/O Functions.       (line 129)
+* troubleshooting, system() function:    I/O Functions.       (line 128)
 * troubleshooting, typographical errors, global variables: Options.
                                                               (line  99)
 * true, logical:                         Truth Values.        (line   6)
@@ -36051,444 +36072,445 @@ Node: Special Network315828
 Node: Special Caveats316688
 Node: Close Files And Pipes317637
 Ref: table-close-pipe-return-values324544
-Ref: Close Files And Pipes-Footnote-1325327
-Ref: Close Files And Pipes-Footnote-2325475
-Node: Nonfatal325627
-Node: Output Summary327952
-Node: Output Exercises329174
-Node: Expressions329853
-Node: Values331041
-Node: Constants331719
-Node: Scalar Constants332410
-Ref: Scalar Constants-Footnote-1333274
-Node: Nondecimal-numbers333524
-Node: Regexp Constants336525
-Node: Using Constant Regexps337051
-Node: Standard Regexp Constants337673
-Node: Strong Regexp Constants340861
-Node: Variables343819
-Node: Using Variables344476
-Node: Assignment Options346386
-Node: Conversion348259
-Node: Strings And Numbers348783
-Ref: Strings And Numbers-Footnote-1351846
-Node: Locale influences conversions351955
-Ref: table-locale-affects354713
-Node: All Operators355331
-Node: Arithmetic Ops355960
-Node: Concatenation358466
-Ref: Concatenation-Footnote-1361313
-Node: Assignment Ops361420
-Ref: table-assign-ops366411
-Node: Increment Ops367724
-Node: Truth Values and Conditions371184
-Node: Truth Values372258
-Node: Typing and Comparison373306
-Node: Variable Typing374126
-Ref: Variable Typing-Footnote-1380589
-Ref: Variable Typing-Footnote-2380661
-Node: Comparison Operators380738
-Ref: table-relational-ops381157
-Node: POSIX String Comparison384652
-Ref: POSIX String Comparison-Footnote-1386347
-Ref: POSIX String Comparison-Footnote-2386486
-Node: Boolean Ops386570
-Ref: Boolean Ops-Footnote-1391052
-Node: Conditional Exp391144
-Node: Function Calls392880
-Node: Precedence396757
-Node: Locales400416
-Node: Expressions Summary402048
-Node: Patterns and Actions404621
-Node: Pattern Overview405741
-Node: Regexp Patterns407418
-Node: Expression Patterns407960
-Node: Ranges411741
-Node: BEGIN/END414849
-Node: Using BEGIN/END415610
-Ref: Using BEGIN/END-Footnote-1418346
-Node: I/O And BEGIN/END418452
-Node: BEGINFILE/ENDFILE420766
-Node: Empty423679
-Node: Using Shell Variables423996
-Node: Action Overview426270
-Node: Statements428595
-Node: If Statement430443
-Node: While Statement431938
-Node: Do Statement433966
-Node: For Statement435114
-Node: Switch Statement438285
-Node: Break Statement440671
-Node: Continue Statement442763
-Node: Next Statement444590
-Node: Nextfile Statement446973
-Node: Exit Statement449625
-Node: Built-in Variables452028
-Node: User-modified453161
-Node: Auto-set460928
-Ref: Auto-set-Footnote-1477261
-Ref: Auto-set-Footnote-2477467
-Node: ARGC and ARGV477523
-Node: Pattern Action Summary481736
-Node: Arrays484166
-Node: Array Basics485495
-Node: Array Intro486339
-Ref: figure-array-elements488314
-Ref: Array Intro-Footnote-1491018
-Node: Reference to Elements491146
-Node: Assigning Elements493610
-Node: Array Example494101
-Node: Scanning an Array495860
-Node: Controlling Scanning498882
-Ref: Controlling Scanning-Footnote-1504281
-Node: Numeric Array Subscripts504597
-Node: Uninitialized Subscripts506781
-Node: Delete508400
-Ref: Delete-Footnote-1511152
-Node: Multidimensional511209
-Node: Multiscanning514304
-Node: Arrays of Arrays515895
-Node: Arrays Summary520662
-Node: Functions522755
-Node: Built-in523793
-Node: Calling Built-in524874
-Node: Numeric Functions526870
-Ref: Numeric Functions-Footnote-1530898
-Ref: Numeric Functions-Footnote-2531255
-Ref: Numeric Functions-Footnote-3531303
-Node: String Functions531575
-Ref: String Functions-Footnote-1555233
-Ref: String Functions-Footnote-2555361
-Ref: String Functions-Footnote-3555609
-Node: Gory Details555696
-Ref: table-sub-escapes557487
-Ref: table-sub-proposed559006
-Ref: table-posix-sub560369
-Ref: table-gensub-escapes561910
-Ref: Gory Details-Footnote-1562733
-Node: I/O Functions562887
-Ref: table-system-return-values569469
-Ref: I/O Functions-Footnote-1571449
-Ref: I/O Functions-Footnote-2571597
-Node: Time Functions571717
-Ref: Time Functions-Footnote-1582388
-Ref: Time Functions-Footnote-2582456
-Ref: Time Functions-Footnote-3582614
-Ref: Time Functions-Footnote-4582725
-Ref: Time Functions-Footnote-5582837
-Ref: Time Functions-Footnote-6583064
-Node: Bitwise Functions583330
-Ref: table-bitwise-ops583924
-Ref: Bitwise Functions-Footnote-1589957
-Ref: Bitwise Functions-Footnote-2590130
-Node: Type Functions590321
-Node: I18N Functions593072
-Node: User-defined594723
-Node: Definition Syntax595528
-Ref: Definition Syntax-Footnote-1601215
-Node: Function Example601286
-Ref: Function Example-Footnote-1604208
-Node: Function Caveats604230
-Node: Calling A Function604748
-Node: Variable Scope605706
-Node: Pass By Value/Reference608700
-Node: Return Statement612199
-Node: Dynamic Typing615178
-Node: Indirect Calls616108
-Ref: Indirect Calls-Footnote-1626360
-Node: Functions Summary626488
-Node: Library Functions629193
-Ref: Library Functions-Footnote-1632800
-Ref: Library Functions-Footnote-2632943
-Node: Library Names633114
-Ref: Library Names-Footnote-1636574
-Ref: Library Names-Footnote-2636797
-Node: General Functions636883
-Node: Strtonum Function637986
-Node: Assert Function641008
-Node: Round Function644334
-Node: Cliff Random Function645875
-Node: Ordinal Functions646891
-Ref: Ordinal Functions-Footnote-1649954
-Ref: Ordinal Functions-Footnote-2650206
-Node: Join Function650416
-Ref: Join Function-Footnote-1652186
-Node: Getlocaltime Function652386
-Node: Readfile Function656128
-Node: Shell Quoting658105
-Node: Data File Management659506
-Node: Filetrans Function660138
-Node: Rewind Function664234
-Node: File Checking666144
-Ref: File Checking-Footnote-1667478
-Node: Empty Files667679
-Node: Ignoring Assigns669658
-Node: Getopt Function671208
-Ref: Getopt Function-Footnote-1682677
-Node: Passwd Functions682877
-Ref: Passwd Functions-Footnote-1691716
-Node: Group Functions691804
-Ref: Group Functions-Footnote-1699702
-Node: Walking Arrays699909
-Node: Library Functions Summary702917
-Node: Library Exercises704323
-Node: Sample Programs704788
-Node: Running Examples705558
-Node: Clones706286
-Node: Cut Program707510
-Node: Egrep Program717439
-Ref: Egrep Program-Footnote-1724951
-Node: Id Program725061
-Node: Split Program728741
-Ref: Split Program-Footnote-1732200
-Node: Tee Program732329
-Node: Uniq Program735119
-Node: Wc Program742545
-Ref: Wc Program-Footnote-1746800
-Node: Miscellaneous Programs746894
-Node: Dupword Program748107
-Node: Alarm Program750137
-Node: Translate Program754992
-Ref: Translate Program-Footnote-1759557
-Node: Labels Program759827
-Ref: Labels Program-Footnote-1763178
-Node: Word Sorting763262
-Node: History Sorting767334
-Node: Extract Program769169
-Node: Simple Sed776699
-Node: Igawk Program779773
-Ref: Igawk Program-Footnote-1794104
-Ref: Igawk Program-Footnote-2794306
-Ref: Igawk Program-Footnote-3794428
-Node: Anagram Program794543
-Node: Signature Program797605
-Node: Programs Summary798852
-Node: Programs Exercises800066
-Ref: Programs Exercises-Footnote-1804195
-Node: Advanced Features804286
-Node: Nondecimal Data806276
-Node: Array Sorting807867
-Node: Controlling Array Traversal808567
-Ref: Controlling Array Traversal-Footnote-1816934
-Node: Array Sorting Functions817052
-Ref: Array Sorting Functions-Footnote-1822143
-Node: Two-way I/O822339
-Ref: Two-way I/O-Footnote-1828891
-Ref: Two-way I/O-Footnote-2829078
-Node: TCP/IP Networking829160
-Node: Profiling832278
-Ref: Profiling-Footnote-1840950
-Node: Advanced Features Summary841273
-Node: Internationalization843117
-Node: I18N and L10N844597
-Node: Explaining gettext845284
-Ref: Explaining gettext-Footnote-1851176
-Ref: Explaining gettext-Footnote-2851361
-Node: Programmer i18n851526
-Ref: Programmer i18n-Footnote-1856475
-Node: Translator i18n856524
-Node: String Extraction857318
-Ref: String Extraction-Footnote-1858450
-Node: Printf Ordering858536
-Ref: Printf Ordering-Footnote-1861322
-Node: I18N Portability861386
-Ref: I18N Portability-Footnote-1863842
-Node: I18N Example863905
-Ref: I18N Example-Footnote-1866711
-Node: Gawk I18N866784
-Node: I18N Summary867429
-Node: Debugger868770
-Node: Debugging869793
-Node: Debugging Concepts870234
-Node: Debugging Terms872043
-Node: Awk Debugging874618
-Node: Sample Debugging Session875524
-Node: Debugger Invocation876058
-Node: Finding The Bug877444
-Node: List of Debugger Commands883922
-Node: Breakpoint Control885255
-Node: Debugger Execution Control888949
-Node: Viewing And Changing Data892311
-Node: Execution Stack895685
-Node: Debugger Info897322
-Node: Miscellaneous Debugger Commands901393
-Node: Readline Support906481
-Node: Limitations907377
-Node: Debugging Summary909486
-Node: Arbitrary Precision Arithmetic910765
-Node: Computer Arithmetic912250
-Ref: table-numeric-ranges915841
-Ref: Computer Arithmetic-Footnote-1916563
-Node: Math Definitions916620
-Ref: table-ieee-formats919936
-Ref: Math Definitions-Footnote-1920539
-Node: MPFR features920644
-Node: FP Math Caution922362
-Ref: FP Math Caution-Footnote-1923434
-Node: Inexactness of computations923803
-Node: Inexact representation924763
-Node: Comparing FP Values926123
-Node: Errors accumulate927205
-Node: Getting Accuracy928638
-Node: Try To Round931348
-Node: Setting precision932247
-Ref: table-predefined-precision-strings932944
-Node: Setting the rounding mode934774
-Ref: table-gawk-rounding-modes935148
-Ref: Setting the rounding mode-Footnote-1938523
-Node: Arbitrary Precision Integers938702
-Ref: Arbitrary Precision Integers-Footnote-1941877
-Node: Checking for MPFR942026
-Node: POSIX Floating Point Problems943323
-Ref: POSIX Floating Point Problems-Footnote-1947194
-Node: Floating point summary947232
-Node: Dynamic Extensions949422
-Node: Extension Intro950975
-Node: Plugin License952241
-Node: Extension Mechanism Outline953038
-Ref: figure-load-extension953477
-Ref: figure-register-new-function955042
-Ref: figure-call-new-function956134
-Node: Extension API Description958196
-Node: Extension API Functions Introduction959838
-Node: General Data Types965378
-Ref: General Data Types-Footnote-1973739
-Node: Memory Allocation Functions974038
-Ref: Memory Allocation Functions-Footnote-1978246
-Node: Constructor Functions978345
-Node: Registration Functions981931
-Node: Extension Functions982616
-Node: Exit Callback Functions987831
-Node: Extension Version String989081
-Node: Input Parsers989744
-Node: Output Wrappers1002465
-Node: Two-way processors1006977
-Node: Printing Messages1009242
-Ref: Printing Messages-Footnote-11010413
-Node: Updating ERRNO1010566
-Node: Requesting Values1011305
-Ref: table-value-types-returned1012042
-Node: Accessing Parameters1012978
-Node: Symbol Table Access1014213
-Node: Symbol table by name1014725
-Node: Symbol table by cookie1016514
-Ref: Symbol table by cookie-Footnote-11020699
-Node: Cached values1020763
-Ref: Cached values-Footnote-11024299
-Node: Array Manipulation1024452
-Ref: Array Manipulation-Footnote-11025543
-Node: Array Data Types1025580
-Ref: Array Data Types-Footnote-11028238
-Node: Array Functions1028330
-Node: Flattening Arrays1032828
-Node: Creating Arrays1039804
-Node: Redirection API1044573
-Node: Extension API Variables1047406
-Node: Extension Versioning1048117
-Ref: gawk-api-version1048546
-Node: Extension GMP/MPFR Versioning1050274
-Node: Extension API Informational Variables1051902
-Node: Extension API Boilerplate1052975
-Node: Changes from API V11056949
-Node: Finding Extensions1058521
-Node: Extension Example1059080
-Node: Internal File Description1059878
-Node: Internal File Ops1063958
-Ref: Internal File Ops-Footnote-11075358
-Node: Using Internal File Ops1075498
-Ref: Using Internal File Ops-Footnote-11077881
-Node: Extension Samples1078155
-Node: Extension Sample File Functions1079684
-Node: Extension Sample Fnmatch1087333
-Node: Extension Sample Fork1088820
-Node: Extension Sample Inplace1090038
-Node: Extension Sample Ord1093255
-Node: Extension Sample Readdir1094091
-Ref: table-readdir-file-types1094980
-Node: Extension Sample Revout1095785
-Node: Extension Sample Rev2way1096374
-Node: Extension Sample Read write array1097114
-Node: Extension Sample Readfile1099056
-Node: Extension Sample Time1100151
-Node: Extension Sample API Tests1101499
-Node: gawkextlib1101991
-Node: Extension summary1104447
-Node: Extension Exercises1108149
-Node: Language History1109647
-Node: V7/SVR3.11111303
-Node: SVR41113455
-Node: POSIX1114889
-Node: BTL1116269
-Node: POSIX/GNU1116998
-Node: Feature History1122776
-Node: Common Extensions1138635
-Node: Ranges and Locales1139918
-Ref: Ranges and Locales-Footnote-11144534
-Ref: Ranges and Locales-Footnote-21144561
-Ref: Ranges and Locales-Footnote-31144796
-Node: Contributors1145017
-Node: History summary1150962
-Node: Installation1152342
-Node: Gawk Distribution1153286
-Node: Getting1153770
-Node: Extracting1154733
-Node: Distribution contents1156371
-Node: Unix Installation1162851
-Node: Quick Installation1163533
-Node: Shell Startup Files1165947
-Node: Additional Configuration Options1167036
-Node: Configuration Philosophy1169025
-Node: Non-Unix Installation1171394
-Node: PC Installation1171854
-Node: PC Binary Installation1172692
-Node: PC Compiling1173127
-Node: PC Using1174244
-Node: Cygwin1177289
-Node: MSYS1178059
-Node: VMS Installation1178560
-Node: VMS Compilation1179351
-Ref: VMS Compilation-Footnote-11180580
-Node: VMS Dynamic Extensions1180638
-Node: VMS Installation Details1182323
-Node: VMS Running1184576
-Node: VMS GNV1188855
-Node: VMS Old Gawk1189590
-Node: Bugs1190061
-Node: Bug address1190724
-Node: Usenet1193516
-Node: Maintainers1194293
-Node: Other Versions1195554
-Node: Installation summary1202316
-Node: Notes1203518
-Node: Compatibility Mode1204383
-Node: Additions1205165
-Node: Accessing The Source1206090
-Node: Adding Code1207527
-Node: New Ports1213746
-Node: Derived Files1218234
-Ref: Derived Files-Footnote-11223880
-Ref: Derived Files-Footnote-21223915
-Ref: Derived Files-Footnote-31224513
-Node: Future Extensions1224627
-Node: Implementation Limitations1225285
-Node: Extension Design1226468
-Node: Old Extension Problems1227622
-Ref: Old Extension Problems-Footnote-11229140
-Node: Extension New Mechanism Goals1229197
-Ref: Extension New Mechanism Goals-Footnote-11232561
-Node: Extension Other Design Decisions1232750
-Node: Extension Future Growth1234863
-Node: Old Extension Mechanism1235699
-Node: Notes summary1237462
-Node: Basic Concepts1238644
-Node: Basic High Level1239325
-Ref: figure-general-flow1239607
-Ref: figure-process-flow1240292
-Ref: Basic High Level-Footnote-11243593
-Node: Basic Data Typing1243778
-Node: Glossary1247106
-Node: Copying1278942
-Node: GNU Free Documentation License1316481
-Node: Index1341599
+Ref: Close Files And Pipes-Footnote-1325357
+Ref: Close Files And Pipes-Footnote-2325505
+Node: Nonfatal325657
+Node: Output Summary327995
+Node: Output Exercises329217
+Node: Expressions329896
+Node: Values331084
+Node: Constants331762
+Node: Scalar Constants332453
+Ref: Scalar Constants-Footnote-1333317
+Node: Nondecimal-numbers333567
+Node: Regexp Constants336568
+Node: Using Constant Regexps337094
+Node: Standard Regexp Constants337716
+Node: Strong Regexp Constants340904
+Node: Variables343862
+Node: Using Variables344519
+Node: Assignment Options346429
+Node: Conversion348302
+Node: Strings And Numbers348826
+Ref: Strings And Numbers-Footnote-1351889
+Node: Locale influences conversions351998
+Ref: table-locale-affects354756
+Node: All Operators355374
+Node: Arithmetic Ops356003
+Node: Concatenation358509
+Ref: Concatenation-Footnote-1361356
+Node: Assignment Ops361463
+Ref: table-assign-ops366454
+Node: Increment Ops367767
+Node: Truth Values and Conditions371227
+Node: Truth Values372301
+Node: Typing and Comparison373349
+Node: Variable Typing374169
+Ref: Variable Typing-Footnote-1380632
+Ref: Variable Typing-Footnote-2380704
+Node: Comparison Operators380781
+Ref: table-relational-ops381200
+Node: POSIX String Comparison384695
+Ref: POSIX String Comparison-Footnote-1386390
+Ref: POSIX String Comparison-Footnote-2386529
+Node: Boolean Ops386613
+Ref: Boolean Ops-Footnote-1391095
+Node: Conditional Exp391187
+Node: Function Calls392923
+Node: Precedence396800
+Node: Locales400459
+Node: Expressions Summary402091
+Node: Patterns and Actions404664
+Node: Pattern Overview405784
+Node: Regexp Patterns407461
+Node: Expression Patterns408003
+Node: Ranges411784
+Node: BEGIN/END414892
+Node: Using BEGIN/END415653
+Ref: Using BEGIN/END-Footnote-1418389
+Node: I/O And BEGIN/END418495
+Node: BEGINFILE/ENDFILE420809
+Node: Empty423722
+Node: Using Shell Variables424039
+Node: Action Overview426313
+Node: Statements428638
+Node: If Statement430486
+Node: While Statement431981
+Node: Do Statement434009
+Node: For Statement435157
+Node: Switch Statement438328
+Node: Break Statement440714
+Node: Continue Statement442806
+Node: Next Statement444633
+Node: Nextfile Statement447016
+Node: Exit Statement449668
+Node: Built-in Variables452071
+Node: User-modified453204
+Node: Auto-set460971
+Ref: Auto-set-Footnote-1477304
+Ref: Auto-set-Footnote-2477510
+Node: ARGC and ARGV477566
+Node: Pattern Action Summary481779
+Node: Arrays484209
+Node: Array Basics485538
+Node: Array Intro486382
+Ref: figure-array-elements488357
+Ref: Array Intro-Footnote-1491061
+Node: Reference to Elements491189
+Node: Assigning Elements493653
+Node: Array Example494144
+Node: Scanning an Array495903
+Node: Controlling Scanning498925
+Ref: Controlling Scanning-Footnote-1504324
+Node: Numeric Array Subscripts504640
+Node: Uninitialized Subscripts506824
+Node: Delete508443
+Ref: Delete-Footnote-1511195
+Node: Multidimensional511252
+Node: Multiscanning514347
+Node: Arrays of Arrays515938
+Node: Arrays Summary520705
+Node: Functions522798
+Node: Built-in523836
+Node: Calling Built-in524917
+Node: Numeric Functions526913
+Ref: Numeric Functions-Footnote-1530941
+Ref: Numeric Functions-Footnote-2531298
+Ref: Numeric Functions-Footnote-3531346
+Node: String Functions531618
+Ref: String Functions-Footnote-1555276
+Ref: String Functions-Footnote-2555404
+Ref: String Functions-Footnote-3555652
+Node: Gory Details555739
+Ref: table-sub-escapes557530
+Ref: table-sub-proposed559049
+Ref: table-posix-sub560412
+Ref: table-gensub-escapes561953
+Ref: Gory Details-Footnote-1562776
+Node: I/O Functions562930
+Ref: table-system-return-values569398
+Ref: I/O Functions-Footnote-1571378
+Ref: I/O Functions-Footnote-2571526
+Node: Time Functions571646
+Ref: Time Functions-Footnote-1582317
+Ref: Time Functions-Footnote-2582385
+Ref: Time Functions-Footnote-3582543
+Ref: Time Functions-Footnote-4582654
+Ref: Time Functions-Footnote-5582766
+Ref: Time Functions-Footnote-6582993
+Node: Bitwise Functions583259
+Ref: table-bitwise-ops583853
+Ref: Bitwise Functions-Footnote-1589898
+Ref: Bitwise Functions-Footnote-2590071
+Node: Type Functions590262
+Node: I18N Functions593013
+Node: User-defined594664
+Node: Definition Syntax595469
+Ref: Definition Syntax-Footnote-1601156
+Node: Function Example601227
+Ref: Function Example-Footnote-1604149
+Node: Function Caveats604171
+Node: Calling A Function604689
+Node: Variable Scope605647
+Node: Pass By Value/Reference608641
+Node: Return Statement612140
+Node: Dynamic Typing615119
+Node: Indirect Calls616049
+Ref: Indirect Calls-Footnote-1626301
+Node: Functions Summary626429
+Node: Library Functions629134
+Ref: Library Functions-Footnote-1632741
+Ref: Library Functions-Footnote-2632884
+Node: Library Names633055
+Ref: Library Names-Footnote-1636515
+Ref: Library Names-Footnote-2636738
+Node: General Functions636824
+Node: Strtonum Function637927
+Node: Assert Function640949
+Node: Round Function644275
+Node: Cliff Random Function645815
+Node: Ordinal Functions646831
+Ref: Ordinal Functions-Footnote-1649894
+Ref: Ordinal Functions-Footnote-2650146
+Node: Join Function650356
+Ref: Join Function-Footnote-1652126
+Node: Getlocaltime Function652326
+Node: Readfile Function656068
+Node: Shell Quoting658045
+Node: Data File Management659446
+Node: Filetrans Function660078
+Node: Rewind Function664174
+Node: File Checking666084
+Ref: File Checking-Footnote-1667418
+Node: Empty Files667619
+Node: Ignoring Assigns669598
+Node: Getopt Function671148
+Ref: Getopt Function-Footnote-1682617
+Node: Passwd Functions682817
+Ref: Passwd Functions-Footnote-1691656
+Node: Group Functions691744
+Ref: Group Functions-Footnote-1699642
+Node: Walking Arrays699849
+Node: Library Functions Summary702857
+Node: Library Exercises704263
+Node: Sample Programs704728
+Node: Running Examples705498
+Node: Clones706226
+Node: Cut Program707450
+Node: Egrep Program717379
+Ref: Egrep Program-Footnote-1724891
+Node: Id Program725001
+Node: Split Program728681
+Ref: Split Program-Footnote-1732139
+Node: Tee Program732268
+Node: Uniq Program735058
+Node: Wc Program742484
+Ref: Wc Program-Footnote-1746739
+Node: Miscellaneous Programs746833
+Node: Dupword Program748046
+Node: Alarm Program750076
+Node: Translate Program754931
+Ref: Translate Program-Footnote-1759496
+Node: Labels Program759766
+Ref: Labels Program-Footnote-1763117
+Node: Word Sorting763201
+Node: History Sorting767273
+Node: Extract Program769108
+Node: Simple Sed776638
+Node: Igawk Program779712
+Ref: Igawk Program-Footnote-1794043
+Ref: Igawk Program-Footnote-2794245
+Ref: Igawk Program-Footnote-3794367
+Node: Anagram Program794482
+Node: Signature Program797544
+Node: Programs Summary798791
+Node: Programs Exercises800005
+Ref: Programs Exercises-Footnote-1804134
+Node: Advanced Features804225
+Node: Nondecimal Data806215
+Node: Array Sorting807806
+Node: Controlling Array Traversal808506
+Ref: Controlling Array Traversal-Footnote-1816874
+Node: Array Sorting Functions816992
+Ref: Array Sorting Functions-Footnote-1822083
+Node: Two-way I/O822279
+Ref: Two-way I/O-Footnote-1828831
+Ref: Two-way I/O-Footnote-2829018
+Node: TCP/IP Networking829100
+Node: Profiling832218
+Ref: Profiling-Footnote-1840890
+Node: Advanced Features Summary841213
+Node: Internationalization843057
+Node: I18N and L10N844537
+Node: Explaining gettext845224
+Ref: Explaining gettext-Footnote-1851116
+Ref: Explaining gettext-Footnote-2851301
+Node: Programmer i18n851466
+Ref: Programmer i18n-Footnote-1856415
+Node: Translator i18n856464
+Node: String Extraction857258
+Ref: String Extraction-Footnote-1858390
+Node: Printf Ordering858476
+Ref: Printf Ordering-Footnote-1861262
+Node: I18N Portability861326
+Ref: I18N Portability-Footnote-1863782
+Node: I18N Example863845
+Ref: I18N Example-Footnote-1866651
+Node: Gawk I18N866724
+Node: I18N Summary867369
+Node: Debugger868710
+Node: Debugging869733
+Node: Debugging Concepts870174
+Node: Debugging Terms871983
+Node: Awk Debugging874558
+Node: Sample Debugging Session875464
+Node: Debugger Invocation875998
+Node: Finding The Bug877384
+Node: List of Debugger Commands883862
+Node: Breakpoint Control885195
+Node: Debugger Execution Control888889
+Node: Viewing And Changing Data892251
+Node: Execution Stack895625
+Node: Debugger Info897262
+Node: Miscellaneous Debugger Commands901333
+Node: Readline Support906395
+Node: Limitations907291
+Node: Debugging Summary909400
+Node: Arbitrary Precision Arithmetic910679
+Node: Computer Arithmetic912164
+Ref: table-numeric-ranges915930
+Ref: table-floating-point-ranges916423
+Ref: Computer Arithmetic-Footnote-1917081
+Node: Math Definitions917138
+Ref: table-ieee-formats920454
+Ref: Math Definitions-Footnote-1921057
+Node: MPFR features921162
+Node: FP Math Caution922880
+Ref: FP Math Caution-Footnote-1923952
+Node: Inexactness of computations924321
+Node: Inexact representation925281
+Node: Comparing FP Values926641
+Node: Errors accumulate927723
+Node: Getting Accuracy929156
+Node: Try To Round931866
+Node: Setting precision932765
+Ref: table-predefined-precision-strings933462
+Node: Setting the rounding mode935292
+Ref: table-gawk-rounding-modes935666
+Ref: Setting the rounding mode-Footnote-1939041
+Node: Arbitrary Precision Integers939220
+Ref: Arbitrary Precision Integers-Footnote-1942395
+Node: Checking for MPFR942544
+Node: POSIX Floating Point Problems943841
+Ref: POSIX Floating Point Problems-Footnote-1947712
+Node: Floating point summary947750
+Node: Dynamic Extensions949940
+Node: Extension Intro951493
+Node: Plugin License952759
+Node: Extension Mechanism Outline953556
+Ref: figure-load-extension953995
+Ref: figure-register-new-function955560
+Ref: figure-call-new-function956652
+Node: Extension API Description958714
+Node: Extension API Functions Introduction960356
+Node: General Data Types965896
+Ref: General Data Types-Footnote-1974257
+Node: Memory Allocation Functions974556
+Ref: Memory Allocation Functions-Footnote-1978766
+Node: Constructor Functions978865
+Node: Registration Functions982451
+Node: Extension Functions983136
+Node: Exit Callback Functions988351
+Node: Extension Version String989601
+Node: Input Parsers990264
+Node: Output Wrappers1002985
+Node: Two-way processors1007497
+Node: Printing Messages1009762
+Ref: Printing Messages-Footnote-11010933
+Node: Updating ERRNO1011086
+Node: Requesting Values1011825
+Ref: table-value-types-returned1012562
+Node: Accessing Parameters1013498
+Node: Symbol Table Access1014733
+Node: Symbol table by name1015245
+Node: Symbol table by cookie1017034
+Ref: Symbol table by cookie-Footnote-11021219
+Node: Cached values1021283
+Ref: Cached values-Footnote-11024819
+Node: Array Manipulation1024972
+Ref: Array Manipulation-Footnote-11026063
+Node: Array Data Types1026100
+Ref: Array Data Types-Footnote-11028758
+Node: Array Functions1028850
+Node: Flattening Arrays1033348
+Node: Creating Arrays1040324
+Node: Redirection API1045091
+Node: Extension API Variables1047924
+Node: Extension Versioning1048635
+Ref: gawk-api-version1049064
+Node: Extension GMP/MPFR Versioning1050795
+Node: Extension API Informational Variables1052423
+Node: Extension API Boilerplate1053496
+Node: Changes from API V11057470
+Node: Finding Extensions1059042
+Node: Extension Example1059601
+Node: Internal File Description1060399
+Node: Internal File Ops1064479
+Ref: Internal File Ops-Footnote-11075830
+Node: Using Internal File Ops1075970
+Ref: Using Internal File Ops-Footnote-11078353
+Node: Extension Samples1078627
+Node: Extension Sample File Functions1080156
+Node: Extension Sample Fnmatch1087805
+Node: Extension Sample Fork1089292
+Node: Extension Sample Inplace1090510
+Node: Extension Sample Ord1093727
+Node: Extension Sample Readdir1094563
+Ref: table-readdir-file-types1095452
+Node: Extension Sample Revout1096257
+Node: Extension Sample Rev2way1096846
+Node: Extension Sample Read write array1097586
+Node: Extension Sample Readfile1099528
+Node: Extension Sample Time1100623
+Node: Extension Sample API Tests1101971
+Node: gawkextlib1102463
+Node: Extension summary1104919
+Node: Extension Exercises1108621
+Node: Language History1110119
+Node: V7/SVR3.11111775
+Node: SVR41113927
+Node: POSIX1115361
+Node: BTL1116741
+Node: POSIX/GNU1117470
+Node: Feature History1123248
+Node: Common Extensions1139107
+Node: Ranges and Locales1140390
+Ref: Ranges and Locales-Footnote-11145006
+Ref: Ranges and Locales-Footnote-21145033
+Ref: Ranges and Locales-Footnote-31145268
+Node: Contributors1145489
+Node: History summary1151434
+Node: Installation1152814
+Node: Gawk Distribution1153758
+Node: Getting1154242
+Node: Extracting1155205
+Node: Distribution contents1156843
+Node: Unix Installation1163323
+Node: Quick Installation1164005
+Node: Shell Startup Files1166419
+Node: Additional Configuration Options1167508
+Node: Configuration Philosophy1169497
+Node: Non-Unix Installation1171866
+Node: PC Installation1172326
+Node: PC Binary Installation1173164
+Node: PC Compiling1173599
+Node: PC Using1174716
+Node: Cygwin1177761
+Node: MSYS1178531
+Node: VMS Installation1179032
+Node: VMS Compilation1179823
+Ref: VMS Compilation-Footnote-11181052
+Node: VMS Dynamic Extensions1181110
+Node: VMS Installation Details1182795
+Node: VMS Running1185048
+Node: VMS GNV1189327
+Node: VMS Old Gawk1190062
+Node: Bugs1190533
+Node: Bug address1191196
+Node: Usenet1193988
+Node: Maintainers1194765
+Node: Other Versions1196026
+Node: Installation summary1202788
+Node: Notes1203990
+Node: Compatibility Mode1204855
+Node: Additions1205637
+Node: Accessing The Source1206562
+Node: Adding Code1207999
+Node: New Ports1214218
+Node: Derived Files1218706
+Ref: Derived Files-Footnote-11224352
+Ref: Derived Files-Footnote-21224387
+Ref: Derived Files-Footnote-31224985
+Node: Future Extensions1225099
+Node: Implementation Limitations1225757
+Node: Extension Design1226940
+Node: Old Extension Problems1228094
+Ref: Old Extension Problems-Footnote-11229612
+Node: Extension New Mechanism Goals1229669
+Ref: Extension New Mechanism Goals-Footnote-11233033
+Node: Extension Other Design Decisions1233222
+Node: Extension Future Growth1235335
+Node: Old Extension Mechanism1236171
+Node: Notes summary1237934
+Node: Basic Concepts1239116
+Node: Basic High Level1239797
+Ref: figure-general-flow1240079
+Ref: figure-process-flow1240764
+Ref: Basic High Level-Footnote-11244065
+Node: Basic Data Typing1244250
+Node: Glossary1247578
+Node: Copying1279416
+Node: GNU Free Documentation License1316955
+Node: Index1342073
 
 End Tag Table
diff --git a/doc/gawk.texi b/doc/gawk.texi
index ab15b0c..781f157 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -1527,9 +1527,11 @@ default @command{awk} utility. A more modern 
@command{awk} lives in
 if you try the test program:
 
 @example
address@hidden
 $ @kbd{awk 1 /dev/null}
 @error{} awk: syntax error near line 1
 @error{} awk: bailing out near line 1
address@hidden group
 @end example
 
 @noindent
@@ -2991,10 +2993,12 @@ for the
 single- and double-quote characters, like so:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{ print "Here is a single quote <\47>" @}'}
 @print{} Here is a single quote <'>
 $ @kbd{awk 'BEGIN @{ print "Here is a double quote <\42>" @}'}
 @print{} Here is a double quote <">
address@hidden group
 @end example
 
 @noindent
@@ -3266,8 +3270,10 @@ action---so it uses the default action, printing the 
record.
 Print the length of the longest input line:
 
 @example
address@hidden
 awk '@{ if (length($0) > max) max = length($0) @}
      END @{ print max @}' data
address@hidden group
 @end example
 
 The code associated with @code{END} executes after all
@@ -3584,11 +3590,13 @@ starts a comment, it ignores @emph{everything} on the 
rest of the
 line. For example:
 
 @example
address@hidden
 $ @kbd{gawk 'BEGIN @{ print "dont panic" # a friendly \}
 > @kbd{                                   BEGIN rule}
 > @address@hidden'}
 @error{} gawk: cmd. line:2:                BEGIN rule
 @error{} gawk: cmd. line:2:                ^ syntax error
address@hidden group
 @end example
 
 @noindent
@@ -4785,10 +4793,12 @@ The files to be included may be nested; e.g., given a 
third
 script, namely @file{test3}:
 
 @example
address@hidden
 @@include "test2"
 BEGIN @{
     print "This is script test3."
 @}
address@hidden group
 @end example
 
 @noindent
@@ -4875,8 +4885,10 @@ $ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
 This is equivalent to the following example:
 
 @example
address@hidden
 $ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
 @print{} A
address@hidden group
 @end example
 
 @noindent
@@ -6499,8 +6511,10 @@ with each @samp{u} changed to a newline.  Here are the 
results of running
 the program on @file{mail-list}:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{ RS = "u" @}}
 >      @address@hidden print $0 @}' mail-list}
address@hidden group
 @print{} Amelia       555-5553     amelia.zodiac
 @print{} sq
 @print{} e@@gmail.com    F
@@ -6657,9 +6671,11 @@ matches either a newline or a series of one or more 
uppercase letters
 with optional leading and/or trailing whitespace:
 
 @example
address@hidden
 $ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
 > @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
 >             @address@hidden print "Record =", $0,"and RT = [" RT "]" @}'}
address@hidden group
 @print{} Record = record 1 and RT = [ AAAA ]
 @print{} Record = record 2 and RT = [ BBBB ]
 @print{} Record = record 3 and RT = [
@@ -7100,8 +7116,10 @@ values of the fields and @code{OFS}.  To do this, use the
 seemingly innocuous assignment:
 
 @example
address@hidden
 $1 = $1   # force record to be reconstituted
 print $0  # or whatever else with $0
address@hidden group
 @end example
 
 @noindent
@@ -7997,16 +8015,20 @@ Putting this to use, here is a simple program to parse 
the data:
 
 @example
 @c file eg/misc/simple-csv.awk
address@hidden
 BEGIN @{
     FPAT = "([^,]+)|(\"[^\"]+\")"
 @}
address@hidden group
 
address@hidden
 @{
     print "NF = ", NF
     for (i = 1; i <= NF; i++) @{
         printf("$%d = <%s>\n", i, $i)
     @}
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -8447,6 +8469,7 @@ read-a-line-and-check-each-rule loop of @command{awk} 
never sees it.
 The following example swaps every two lines of input:
 
 @example
address@hidden
 @{
      if ((getline tmp) > 0) @{
           print tmp
@@ -8454,6 +8477,7 @@ The following example swaps every two lines of input:
      @} else
           print $0
 @}
address@hidden group
 @end example
 
 @noindent
@@ -8596,6 +8620,7 @@ lines that begin with @samp{@@execute}, which are 
replaced by the output
 produced by running the rest of the line as a shell command:
 
 @example
address@hidden
 @{
      if ($1 == "@@execute") @{
           tmp = substr($0, 10)        # Remove "@@execute"
@@ -8605,6 +8630,7 @@ produced by running the rest of the line as a shell 
command:
      @} else
           print
 @}
address@hidden group
 @end example
 
 @noindent
@@ -8908,12 +8934,14 @@ For example, a TCP client can decide to give up on 
receiving
 any response from the server after a certain amount of time:
 
 @example
address@hidden
 Service = "/inet/tcp/0/localhost/daytime"
 PROCINFO[Service, "READ_TIMEOUT"] = 100
 if ((Service |& getline) > 0)
     print $0
 else if (ERRNO != "")
     print ERRNO
address@hidden group
 @end example
 
 Here is how to read interactively from the address@hidden assumes
@@ -9255,10 +9283,12 @@ newlines:
 @end ifnotinfo
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{ print "line one\nline two\nline three" @}'}
 @print{} line one
 @print{} line two
 @print{} line three
address@hidden group
 @end example
 
 @cindex fields, printing
@@ -9510,12 +9540,14 @@ The output separator variables @code{OFS} and 
@code{ORS} have no effect
 on @code{printf} statements. For example:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{}
 >    @kbd{ORS = "\nOUCH!\n"; OFS = "+"}
 >    @kbd{msg = "Don\47t Panic!"}
 >    @kbd{printf "%s\n", msg}
 > @address@hidden'}
 @print{} Don't Panic!
address@hidden group
 @end example
 
 @noindent
@@ -10038,9 +10070,11 @@ alone for now and let's hope no-one notices.
 @end ignore
 
 @example
address@hidden
 awk '@{ print $1 > "names.unsorted"
        command = "sort -r > names.sorted"
        print $1 | command @}' mail-list
address@hidden group
 @end example
 
 The unsorted list is written with an ordinary redirection, while
@@ -10375,7 +10409,7 @@ The @var{protocol} is one of @samp{tcp} or @samp{udp},
 and the other fields represent the other essential pieces of information
 for making a networking connection.
 These @value{FN}s are used with the @samp{|&} operator for communicating
-with a coprocess
+with @w{a coprocess}
 (@pxref{Two-way I/O}).
 This is an advanced feature, mentioned here only for completeness.
 Full discussion is delayed until
@@ -10474,10 +10508,14 @@ it is good practice to use a variable to store the 
@value{FN} or command.
 The previous example becomes the following:
 
 @example
address@hidden
 sortcom = "sort -r names"
 sortcom | getline foo
address@hidden group
address@hidden
 @dots{}
 close(sortcom)
address@hidden group
 @end example
 
 @noindent
@@ -10625,7 +10663,7 @@ if it fails.
 
 @float Table,table-close-pipe-return-values
 @caption{Return values from @code{close()} of a pipe}
address@hidden @columnfractions .40 .60
address@hidden @columnfractions .50 .50
 @headitem Situation @tab Return value from @code{close()}
 @item Normal exit of command @tab Command's exit status
 @item Death by signal of command @tab 256 + number of murderous signal
@@ -10691,7 +10729,7 @@ if it fails.
 
 @float Table,table-close-pipe-return-values
 @caption{Return values from @code{close()} of a pipe}
address@hidden @columnfractions .40 .60
address@hidden @columnfractions .50 .50
 @headitem Situation @tab Return value from @code{close()}
 @item Normal exit of command @tab Command's exit status
 @item Death by signal of command @tab 256 + number of murderous signal
@@ -10721,7 +10759,8 @@ disk) is a fatal error.
 
 @example
 $ @kbd{gawk 'BEGIN @{ print "hi" > "/no/such/file" @}'}
address@hidden gawk: cmd. line:1: fatal: can't redirect to `/no/such/file' (No 
such file or directory)
address@hidden gawk: cmd. line:1: fatal: can't redirect to `/no/such/file' (No
address@hidden such file or directory)
 @end example
 
 @command{gawk} makes it possible to detect that an error has
@@ -11181,6 +11220,7 @@ confusion can arise when attempting to use regexp 
constants as arguments
 to user-defined functions (@pxref{User-defined}).  For example:
 
 @example
address@hidden
 function mysub(pat, repl, str, global)
 @{
     if (global)
@@ -11189,13 +11229,16 @@ function mysub(pat, repl, str, global)
         sub(pat, repl, str)
     return str
 @}
address@hidden group
 
address@hidden
 @{
     @dots{}
     text = "hi! hi yourself!"
     mysub(/hi/, "howdy", text, 1)
     @dots{}
 @}
address@hidden group
 @end example
 
 @c @cindex automatic warnings
@@ -11443,8 +11486,10 @@ is performed.  If numeric values appear in string 
concatenation, they
 are converted to strings.  Consider the following:
 
 @example
address@hidden
 two = 2; three = 3
 print (two three) + 4
address@hidden group
 @end example
 
 @noindent
@@ -11946,10 +11991,14 @@ to it.  In the following program fragment, the 
variable
 @code{foo} has a numeric value at first, and a string value later on:
 
 @example
address@hidden
 foo = 1
 print foo
address@hidden group
address@hidden
 foo = "bar"
 print foo
address@hidden group
 @end example
 
 @noindent
@@ -12021,16 +12070,20 @@ righthand expression.  For example:
 
 @cindex Rankin, Pat
 @example
address@hidden
 # Thanks to Pat Rankin for this example
 BEGIN  @{
     foo[rand()] += 5
     for (x in foo)
        print x, foo[x]
address@hidden group
 
address@hidden
     bar[rand()] = bar[rand()] + 5
     for (x in bar)
        print x, bar[x]
 @}
address@hidden group
 @end example
 
 @cindex operators, assignment, evaluation order
@@ -12816,10 +12869,12 @@ leave off one of the @samp{=} characters.  The result 
is still valid
 @command{awk} code, but the program does not do what is intended:
 
 @example
address@hidden
 if (a = b)   # oops! should be a == b
    @dots{}
 else
    @dots{}
address@hidden group
 @end example
 
 @noindent
@@ -13771,8 +13826,10 @@ $ @kbd{awk '! /li/' mail-list}
 @print{} Bill         555-1675     bill.drowning@@hotmail.com       A
 @print{} Camilla      555-2912     camilla.infusarum@@skynet.be     R
 @print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
address@hidden
 @print{} Martin       555-6480     martin.codicibus@@hotmail.com    A
 @print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
address@hidden group
 @end example
 
 @cindex @code{BEGIN} pattern, Boolean patterns and
@@ -14163,10 +14220,12 @@ the variable's value into the program inside the 
script.
 For example, consider the following program:
 
 @example
address@hidden
 printf "Enter search pattern: "
 read pattern
 awk "/$pattern/ "'@{ nmatches++ @}
      END @{ print nmatches, "found" @}' /path/to/data
address@hidden group
 @end example
 
 @noindent
@@ -14355,10 +14414,12 @@ the null string; otherwise, the condition is true.
 Refer to the following:
 
 @example
address@hidden
 if (x % 2 == 0)
     print "x is even"
 else
     print "x is odd"
address@hidden group
 @end example
 
 In this example, if the expression @samp{x % 2 == 0} is true (i.e.,
@@ -14680,6 +14741,7 @@ finds the smallest divisor of any integer, and also 
identifies prime
 numbers:
 
 @example
address@hidden
 # find smallest divisor of num
 @{
     num = $1
@@ -14687,11 +14749,14 @@ numbers:
         if (num % divisor == 0)
             break
     @}
address@hidden group
address@hidden
     if (num % divisor == 0)
         printf "Smallest divisor of %d is %d\n", num, divisor
     else
         printf "%d is prime\n", num
 @}
address@hidden group
 @end example
 
 When the remainder is zero in the first @code{if} statement, @command{awk}
@@ -14999,14 +15064,18 @@ using an @code{exit} statement with a nonzero 
argument, as shown
 in the following example:
 
 @example
address@hidden
 BEGIN @{
     if (("date" | getline date_now) <= 0) @{
         print "Can't get system date" > "/dev/stderr"
         exit 1
     @}
address@hidden group
address@hidden
     print "current date is", date_now
     close("date")
 @}
address@hidden group
 @end example
 
 @quotation NOTE
@@ -15304,6 +15373,7 @@ Unlike most @command{awk} arrays,
 In the following example:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{}
 >         @kbd{for (i = 0; i < ARGC; i++)}
 >             @kbd{print ARGV[i]}
@@ -15311,6 +15381,7 @@ $ @kbd{awk 'BEGIN @{}
 @print{} awk
 @print{} inventory-shipped
 @print{} mail-list
address@hidden group
 @end example
 
 @noindent
@@ -15735,12 +15806,14 @@ points out that it effectively gives @command{awk} 
data pointers. Consider his
 example:
 
 @example
address@hidden
 # Indirect multiply of any variable by amount, return result
 
 function multiply(variable, amount)
 @{
     return SYMTAB[variable] *= amount
 @}
address@hidden group
 @end example
 
 @noindent
@@ -15858,6 +15931,7 @@ presented the following program describing the 
information contained in @code{AR
 and @code{ARGV}:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{}
 >        @kbd{for (i = 0; i < ARGC; i++)}
 >            @kbd{print ARGV[i]}
@@ -15865,6 +15939,7 @@ $ @kbd{awk 'BEGIN @{}
 @print{} awk
 @print{} inventory-shipped
 @print{} mail-list
address@hidden group
 @end example
 
 @noindent
@@ -16461,8 +16536,10 @@ For example, this statement tests whether the array 
@code{frequencies}
 contains the index @samp{2}:
 
 @example
address@hidden
 if (2 in frequencies)
     print "Subscript 2 is present."
address@hidden group
 @end example
 
 Note that this is @emph{not} a test of whether the array
@@ -16472,8 +16549,10 @@ There is no way to do that except to scan all the 
elements.  Also, this
 (incorrect) alternative does:
 
 @example
address@hidden
 if (frequencies[2] != "")
     print "Subscript 2 is present."
address@hidden group
 @end example
 
 @node Assigning Elements
@@ -16530,6 +16609,7 @@ all the lines.
 When this program is run with the following input:
 
 @example
address@hidden
 @c file eg/misc/arraymax.data
 5  I am the Five man
 2  Who are you?  The new number two!
@@ -16537,17 +16617,20 @@ When this program is run with the following input:
 1  Who is number one?
 3  I three you.
 @c endfile
address@hidden group
 @end example
 
 @noindent
 Its output is:
 
 @example
address@hidden
 1  Who is number one?
 2  Who are you?  The new number two!
 3  I three you.
 4  . . . And four on the floor
 5  I am the Five man
address@hidden group
 @end example
 
 If a line number is repeated, the last line with a given number overrides
@@ -16556,11 +16639,13 @@ Gaps in the line numbers can be handled with an easy 
improvement to the
 program's @code{END} rule, as follows:
 
 @example
address@hidden
 END @{
     for (x = 1; x <= max; x++)
         if (x in arr)
             print arr[x]
 @}
address@hidden group
 @end example
 
 @node Scanning an Array
@@ -16580,8 +16665,10 @@ So @command{awk} has a special kind of @code{for} 
statement for scanning
 an array:
 
 @example
address@hidden
 for (@var{var} in @var{array})
     @var{body}
address@hidden group
 @end example
 
 @noindent
@@ -16602,12 +16689,15 @@ such words.
 for more information on the built-in function @code{length()}.
 
 @example
address@hidden
 # Record a 1 for each word that is used at least once
 @{
     for (i = 1; i <= NF; i++)
         used[$i] = 1
 @}
address@hidden group
 
address@hidden
 # Find number of distinct words more than 10 characters long
 END @{
     for (x in used) @{
@@ -16618,6 +16708,7 @@ END @{
     @}
     print num_long_words, "words longer than 10 characters"
 @}
address@hidden group
 @end example
 
 @noindent
@@ -17005,9 +17096,11 @@ same as assigning it a null value (the empty string, 
@code{""}).
 For example:
 
 @example
address@hidden
 foo[4] = ""
 if (4 in foo)
   print "This is printed, even though foo[4] is empty"
address@hidden group
 @end example
 
 @cindex lint checking, array elements
@@ -17162,22 +17255,26 @@ END @{
 When given the input:
 
 @example
address@hidden
 1 2 3 4 5 6
 2 3 4 5 6 1
 3 4 5 6 1 2
 4 5 6 1 2 3
address@hidden group
 @end example
 
 @noindent
 the program produces the following output:
 
 @example
address@hidden
 4 3 2 1
 5 4 3 2
 6 5 4 3
 1 6 5 4
 2 1 6 5
 3 2 1 6
address@hidden group
 @end example
 
 @node Multiscanning
@@ -17357,15 +17454,19 @@ you can often devise workarounds using control 
statements. For example,
 the following code prints the elements of our main array @code{a}:
 
 @example
address@hidden
 for (i in a) @{
     for (j in a[i]) @{
         if (j == 3) @{
             for (k in a[i][j])
                 print a[i][j][k]
address@hidden group
address@hidden
         @} else
             print a[i][j]
     @}
 @}
address@hidden group
 @end example
 
 @noindent
@@ -17815,9 +17916,11 @@ asort(a)
 results in the following contents of @code{a}:
 
 @example
address@hidden
 a[1] = "cul"
 a[2] = "de"
 a[3] = "sac"
address@hidden group
 @end example
 
 The @code{asorti()} function works similarly to @code{asort()}; however,
@@ -18906,6 +19009,9 @@ a file or pipe that was opened for reading (such as 
with @code{getline}),
 or if @var{filename} is not an open file, pipe, or coprocess.
 In such a case, @code{fflush()} returns @minus{}1, as well.
 
address@hidden end the table to let the sidebar take up the full width of the 
page.
address@hidden table
+
 @cindex sidebar, Interactive Versus Noninteractive Buffering
 @ifdocbook
 @docbook
@@ -19006,6 +19112,7 @@ it is all buffered and sent down the pipe to 
@command{cat} in one shot.
 @end cartouche
 @end ifnotdocbook
 
address@hidden @asis
 @item @code{system(@var{command})}
 @cindexawkfunc{system}
 @cindex invoke shell command
@@ -19798,7 +19905,7 @@ that illustrates the use of these functions:
 @example
 @group
 @c file eg/lib/bits2str.awk
-# bits2str --- turn a byte into readable ones and zeros
+# bits2str --- turn an integer into readable ones and zeros
 
 function bits2str(bits,        data, mask)
 @{
@@ -19820,7 +19927,7 @@ function bits2str(bits,        data, mask)
 @c this is a hack to make testbits.awk self-contained
 @ignore
 @c file eg/prog/testbits.awk
-# bits2str --- turn a byte into readable 1's and 0's
+# bits2str --- turn an integer into readable ones and zeros
 
 function bits2str(bits,        data, mask)
 @{
@@ -19861,7 +19968,8 @@ $ @kbd{gawk -f testbits.awk}
 @print{} 123 = 01111011
 @print{} 0123 = 01010011
 @print{} 0x99 = 10011001
address@hidden compl(0x99) = 0x3fffffffffff66 = 
00111111111111111111111111111111111111111111111101100110
address@hidden compl(0x99) = 0x3fffffffffff66 =
address@hidden 00111111111111111111111111111111111111111111111101100110
 @print{} lshift(0x99, 2) = 0x264 = 0000001001100100
 @print{} rshift(0x99, 2) = 0x26 = 00100110
 @end example
@@ -20200,10 +20308,12 @@ entire program before starting to execute any of it.
 The definition of a function named @var{name} looks like this:
 
 @display
address@hidden
 @code{function} @address@hidden(address@hidden@code{)}
 @address@hidden
      @var{body-of-function}
 @address@hidden
address@hidden group
 @end display
 
 @cindex names, functions
@@ -20371,11 +20481,13 @@ This function deletes all the elements in an array 
(recall that the
 extra whitespace signifies the start of the local variable list):
 
 @example
address@hidden
 function delarray(a,    i)
 @{
     for (i in a)
         delete a[i]
 @}
address@hidden group
 @end example
 
 When working with arrays, it is often necessary to delete all the elements
@@ -20582,10 +20694,12 @@ In addition, recursive calls create new arrays.
 Consider this example:
 
 @example
address@hidden
 function some_func(p1,      a)
 @{
     if (p1++ > 3)
         return
address@hidden group
 
     a[p1] = p1
 
@@ -20649,12 +20763,14 @@ this has no effect on any other variables.  Thus, if 
@code{myfunc()}
 does this:
 
 @example
address@hidden
 function myfunc(str)
 @{
    print str
    str = "zzz"
    print str
 @}
address@hidden group
 @end example
 
 @noindent
@@ -20810,11 +20926,13 @@ function maxelt(vec,   i, ret)
      return ret
 @}
 
address@hidden
 # Load all fields of each record into nums.
 @{
      for(i = 1; i <= NF; i++)
           nums[NR, i] = $i
 @}
address@hidden group
 
 END @{
      print maxelt(nums)
@@ -21108,12 +21226,14 @@ first thing to do is write some comparison functions:
 
 @example
 @c file eg/prog/indirectcall.awk
address@hidden
 # num_lt --- do a numeric less than comparison
 
 function num_lt(left, right)
 @{
     return ((left + 0) < (right + 0))
 @}
address@hidden group
 
 # num_ge --- do a numeric greater than or equal to comparison
 
@@ -21162,19 +21282,23 @@ names of the two comparison functions:
 
 @example
 @c file eg/prog/indirectcall.awk
address@hidden
 # sort --- sort the data in ascending order and return it as a string
 
 function sort(first, last)
 @{
     return do_sort(first, last, "num_lt")
 @}
address@hidden group
 
address@hidden
 # rsort --- sort the data in descending order and return it as a string
 
 function rsort(first, last)
 @{
     return do_sort(first, last, "num_ge")
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -21674,6 +21798,7 @@ been true but was not, and then it kills the program.  
In C, using
 @code{assert()} looks this:
 
 @example
address@hidden
 #include <assert.h>
 
 int myfunc(int a, double b)
@@ -21681,6 +21806,7 @@ int myfunc(int a, double b)
      assert(a <= 5 && b >= 17.1);
      @dots{}
 @}
address@hidden group
 @end example
 
 If the assertion fails, the program prints a message similar to this:
@@ -21838,9 +21964,10 @@ function round(x,   ival, aval, fraction)
 @}
 @c endfile
 @c don't include test harness in the file that gets installed
-
address@hidden
 # test harness
 # @{ print $0, round($0) @}
address@hidden group
 @end example
 
 @node Cliff Random Function
@@ -22246,7 +22373,7 @@ if (length(contents) == 0)
 @end example
 
 This tests the result to see if it is empty or not. An equivalent
-test would be @samp{contents == ""}.
+test would be @address@hidden == ""}}.
 
 @xref{Extension Sample Readfile} for an extension function that
 also reads an entire file into memory.
@@ -22577,8 +22704,10 @@ $ @kbd{gawk -f rewind.awk -f test.awk data }
 @print{} data 1 a
 @print{} data 2 b
 @print{} data 3 c
address@hidden
 @print{} data 4 d
 @print{} data 5 e
address@hidden group
 @end example
 
 @node File Checking
@@ -23793,8 +23922,10 @@ function getgrent()
     _gr_init()
     if (++_gr_count in _gr_bycount)
         return _gr_bycount[_gr_count]
address@hidden
     return ""
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -24324,10 +24455,12 @@ list of fields or characters:
     if (by_fields == 0 && by_chars == 0)
         by_fields = 1    # default
 
address@hidden
     if (fieldlist == "") @{
         print "cut: needs list for -c or -f" > "/dev/stderr"
         exit 1
     @}
address@hidden group
 
     if (by_fields)
         set_fieldlist()
@@ -24668,8 +24801,10 @@ function endfile(file)
             print fcount
     @}
 
address@hidden
     total += fcount
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -24826,11 +24961,15 @@ BEGIN @{
     pw = getpwuid(uid)
     pr_first_field(pw)
 
address@hidden
     if (euid != uid) @{
         printf(" euid=%d", euid)
         pw = getpwuid(euid)
address@hidden group
address@hidden
         pr_first_field(pw)
     @}
address@hidden group
 
     printf(" gid=%d", gid)
     pw = getgrgid(gid)
@@ -24958,14 +25097,17 @@ BEGIN @{
     # test argv in case reading from stdin instead of file
     if (i in ARGV)
         i++    # skip datafile name
address@hidden
     if (i in ARGV) @{
         outfile = ARGV[i]
         ARGV[i] = ""
     @}
-
address@hidden group
address@hidden
     s1 = s2 = "a"
     out = (outfile s1 s2)
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -25121,11 +25263,15 @@ line into each file on the command line, and then to 
the standard output:
 It is also possible to write the loop this way:
 
 @example
address@hidden
 for (i in copy)
     if (append)
         print >> copy[i]
address@hidden group
address@hidden
     else
         print > copy[i]
address@hidden group
 @end example
 
 @noindent
@@ -25276,10 +25422,12 @@ BEGIN @{
             usage()
     @}
 
address@hidden
     if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
         charcount = substr(ARGV[Optind], 2) + 0
         Optind++
     @}
address@hidden group
 
     for (i = 1; i < Optind; i++)
         ARGV[i] = ""
@@ -25313,10 +25461,12 @@ strings are then compared and @code{are_equal()} 
returns the result:
 
 @example
 @c file eg/prog/uniq.awk
address@hidden
 function are_equal(    n, m, clast, cline, alast, aline)
 @{
     if (fcount == 0 && charcount == 0)
         return (last == $0)
address@hidden group
 
     if (fcount > 0) @{
         n = split(last, alast)
@@ -25331,9 +25481,11 @@ function are_equal(    n, m, clast, cline, alast, 
aline)
         clast = substr(clast, charcount + 1)
         cline = substr(cline, charcount + 1)
     @}
address@hidden
 
     return (clast == cline)
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -25392,11 +25544,13 @@ NR == 1 @{
 END @{
     if (do_count)
         printf("%4d %s\n", count, last) > outputfile
address@hidden
     else if ((repeated_only && count > 1) ||
             (non_repeated_only && count == 1))
         print last > outputfile
     close(outputfile)
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -26191,10 +26345,12 @@ At first glance, a program like this would seem to do 
the job:
         freq[$i]++
 @}
 
address@hidden
 END @{
     for (word in freq)
         printf "%s\t%d\n", word, freq[word]
 @}
address@hidden group
 @end example
 
 The program relies on @command{awk}'s default field-splitting
@@ -26584,9 +26740,11 @@ line.  That line is then printed to the output file:
                     i++
             @}
         @}
address@hidden
         print join(a, 1, n, SUBSEP) > curfile
     @}
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -26672,10 +26830,12 @@ function usage()
     exit 1
 @}
 
address@hidden
 BEGIN @{
     # validate arguments
     if (ARGC < 3)
         usage()
address@hidden group
 
     RS = ARGV[1]
     ORS = ARGV[2]
@@ -27069,13 +27229,11 @@ the program is done:
                 continue
             @}
             fpath = pathto($2)
address@hidden
             if (fpath == "") @{
                 printf("igawk: %s:%d: cannot find %s\n",
                     input[stackptr], FNR, $2) > "/dev/stderr"
                 continue
             @}
address@hidden group
             if (! (fpath in processed)) @{
                 processed[fpath] = input[stackptr]
                 input[++stackptr] = fpath  # push onto stack
@@ -27332,10 +27490,12 @@ notice and this notice are preserved.
 Here is the program:
 
 @example
address@hidden
 awk 'address@hidden"~"~"~";o="=="=="==";o+=+o;x=O""O;while(X++<=x+o+o)c=c"%c";
 printf c,(x-O)*(x-O),x*(x-o)-o,x*(x-O)+x-O-o,+x*(x-O)-x+o,X*(o*o+O)+x-O,
 X*(X-x)-o*o,(x+X)*o*o+o,x*(X-x)-O-O,x-O+(O+o+X+x)*(o+O),X*X-X*(x-O)-x+O,
 
O+X*(o*(o+O)+O),+x+O+X*o,x*(x-o),(o+X+x)*o*o-(x-O-O),O+(X-x)*(X+O),address@hidden'
address@hidden group
 @end example
 
 @cindex Johansen, Chris
@@ -27823,11 +27983,13 @@ Our first comparison function can be used to scan an 
array in
 numerical order of the indices:
 
 @example
address@hidden
 function cmp_num_idx(i1, v1, i2, v2)
 @{
      # numerical index comparison, ascending order
      return (i1 - i2)
 @}
address@hidden group
 @end example
 
 Our second function traverses an array based on the string order of
@@ -27932,10 +28094,13 @@ function cmp_field(i1, v1, i2, v2)
         a[NR][i] = $i
 @}
 
address@hidden
 END @{
     PROCINFO["sorted_in"] = "cmp_field"
address@hidden group
     if (POS < 1 || POS > NF)
         POS = 1
+
     for (i in a) @{
         for (j = 1; j <= NF; j++)
             printf("%s%c", a[i][j], j < NF ? ":" : "")
@@ -27992,6 +28157,7 @@ function cmp_numeric(i1, v1, i2, v2)
     return (v1 != v2) ? (v2 - v1) : (i2 - i1)
 @}
 
address@hidden
 function cmp_string(i1, v1, i2, v2)
 @{
     # string value (and index) comparison, descending order
@@ -27999,6 +28165,7 @@ function cmp_string(i1, v1, i2, v2)
     v2 = v2 i2
     return (v1 > v2) ? -1 : (v1 != v2)
 @}
address@hidden group
 @end example
 
 @c Avoid using the term ``stable'' when describing the unpredictable behavior
@@ -28152,11 +28319,13 @@ The following example demonstrates the use of a 
comparison function with
 both values to lowercase in order to compare them ignoring case.
 
 @example
address@hidden
 # case_fold_compare --- compare as strings, ignoring case
 
 function case_fold_compare(i1, v1, i2, v2,    l, r)
 @{
     l = tolower(v1)
address@hidden group
     r = tolower(v2)
 
     if (l < r)
@@ -29513,8 +29682,10 @@ This is somewhat counterintuitive.
 and those with positional specifiers in the same string:
 
 @example
address@hidden
 $ @kbd{gawk 'BEGIN @{ printf "%d %3$s\n", 1, 2, "hi" @}'}
 @error{} gawk: cmd. line:1: fatal: must use `count$' on all formats or none
address@hidden group
 @end example
 
 @quotation NOTE
@@ -30139,8 +30310,10 @@ be inside this function.  To investigate further, we 
must begin
 @samp{n} (for ``next''):
 
 @example
address@hidden
 gawk> @kbd{n}
 @print{} 66          if (fcount > 0) @{
address@hidden group
 @end example
 
 This tells us that @command{gawk} is now ready to execute line 66, which
@@ -30909,10 +31082,12 @@ partial dump of Davide Brini's obfuscated code
 
 @c FIXME: This will need updating if num-handler branch is ever merged in.
 @smallexample
address@hidden
 gawk> @kbd{dump}
 @print{}        # BEGIN
 @print{}
 @print{} [  1:0xfcd340] Op_rule           : [in_rule = BEGIN] [source_file = 
brini.awk]
address@hidden group
 @print{} [  1:0xfcc240] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
 @print{} [  1:0xfcc2a0] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
 @print{} [  1:0xfcc280] Op_match          :
@@ -30945,18 +31120,18 @@ gawk> @kbd{dump}
 @print{} [   :0xfcc660] Op_no_op          :
 @print{} [  1:0xfcc520] Op_assign_concat  : c
 @print{} [   :0xfcc620] Op_jmp            : [target_jmp = 0xfcc440]
address@hidden
 @dots{}
address@hidden
 @print{} [     2:0xfcc5a0] Op_K_printf         : [expr_count = 17] [redir_type 
= ""]
 @print{} [      :0xfcc140] Op_no_op            :
 @print{} [      :0xfcc1c0] Op_atexit           :
 @print{} [      :0xfcc640] Op_stop             :
 @print{} [      :0xfcc180] Op_no_op            :
 @print{} [      :0xfcd150] Op_after_beginfile  :
address@hidden
 @print{} [      :0xfcc160] Op_no_op            :
 @print{} [      :0xfcc1a0] Op_after_endfile    :
 gawk>
address@hidden group
 @end smallexample
 
 @cindex @code{exit} debugger command
@@ -31311,6 +31486,7 @@ In computer systems, integer arithmetic is exact, but 
the possible
 range of values is limited.  Integer arithmetic is generally faster than
 floating-point arithmetic.
 
address@hidden floating-point, numbers
 @item Floating-point arithmetic
 Floating-point numbers represent what were called in school ``real''
 numbers (i.e., those that have a fractional part, such as 3.1415927).
@@ -31322,6 +31498,12 @@ Modern systems support floating-point arithmetic in 
hardware, with a
 limited range of values.  There are software libraries that allow
 the use of arbitrary-precision floating-point calculations.
 
address@hidden floating-point, address@hidden single-precision
address@hidden floating-point, address@hidden double-precision
address@hidden floating-point, address@hidden arbitrary-precision
address@hidden single-precision
address@hidden double-precision
address@hidden arbitrary-precision
 POSIX @command{awk} uses @dfn{double-precision} floating-point numbers, which
 can hold more digits than @dfn{single-precision} floating-point numbers.
 @command{gawk} has facilities for performing arbitrary-precision
@@ -31331,29 +31513,48 @@ floating-point arithmetic, which we describe in more 
detail shortly.
 Computers work with integer and floating-point values of different
 ranges. Integer values are usually either 32 or 64 bits in size.
 Single-precision floating-point values occupy 32 bits, whereas double-precision
-floating-point values occupy 64 bits.  Floating-point values are always
-signed. The possible ranges of values are shown in @ref{table-numeric-ranges}.
+floating-point values occupy 64 bits.
+(Quadruple-precision floating point values also exist. They occupy 128 bits,
+but such numbers are not available in @command{awk}.)
+Floating-point values are always
+signed. The possible ranges of values are shown in @ref{table-numeric-ranges}
+and @ref{table-floating-point-ranges}.
 
 @float Table,table-numeric-ranges
address@hidden ranges for different numeric representations}
address@hidden ranges for integer representations}
 @multitable @columnfractions .34 .33 .33
address@hidden Numeric representation @tab Minimum value @tab Maximum value
address@hidden Representation @tab Minimum value @tab Maximum value
 @item 32-bit signed integer @tab @minus{}2,147,483,648 @tab 2,147,483,647
 @item 32-bit unsigned integer @tab 0 @tab 4,294,967,295
 @item 64-bit signed integer @tab @minus{}9,223,372,036,854,775,808 @tab 
9,223,372,036,854,775,807
 @item 64-bit unsigned integer @tab 0 @tab 18,446,744,073,709,551,615
address@hidden multitable
address@hidden float
+
address@hidden Table,table-floating-point-ranges
address@hidden value ranges for floating-point number representations}
address@hidden @columnfractions .38 .22 .22 .23
 @iftex
address@hidden Single-precision floating point (approximate) @tab 
@math{1.175494^{-38}} @tab @math{3.402823^{38}}
address@hidden Double-precision floating point (approximate) @tab 
@math{2.225074^{-308}} @tab @math{1.797693^{308}}
address@hidden Representation @tab @w{Minimum positive} @w{nonzero value} @tab 
Minimum @w{finite value} @tab Maximum @w{finite value}
address@hidden iftex
address@hidden
address@hidden Representation @tab Minimum positive nonzero value @tab Minimum 
finite value @tab Maximum finite value
address@hidden ifnottex
address@hidden
address@hidden @w{Single-precision floating-point} @tab @math{1.175494 @cdot 
10^{-38}} @tab @math{-3.402823 @cdot 10^{38}} @tab @math{3.402823 @cdot 10^{38}}
address@hidden @w{Double-precision floating-point} @tab @math{2.225074 @cdot 
10^{-308}} @tab @math{-1.797693 @cdot 10^{308}} @tab @math{1.797693 @cdot 
10^{308}}
address@hidden @w{Quadruple-precision floating-point} @tab @math{3.362103 @cdot 
10^{-4932}} @tab @math{-1.189731 @cdot 10^{4932}} @tab @math{1.189731 @cdot 
10^{4932}}
 @end iftex
 @ifinfo
address@hidden Single-precision floating point (approximate) @tab 1.175494e-38 
@tab 3.402823e38
address@hidden Double-precision floating point (approximate) @tab 2.225074e-308 
@tab 1.797693e308
address@hidden Single-precision floating-point @tab 1.175494e-38 @tab 
-3.402823e+38 @tab 3.402823e+38
address@hidden Double-precision floating-point @tab 2.225074e-308 @tab 
-1.797693e+308 @tab 1.797693e+308
address@hidden Quadruple-precision floating-point @tab 3.362103e-4932 @tab 
-1.189731e+4932 @tab 1.189731e+4932
 @end ifinfo
 @ifnottex
 @ifnotinfo
address@hidden Single-precision floating point (approximate) @tab 
address@hidden @tab address@hidden
address@hidden Double-precision floating point (approximate) @tab 
address@hidden @tab address@hidden
address@hidden Single-precision floating-point @tab address@hidden @tab 
address@hidden @tab address@hidden
address@hidden Double-precision floating-point @tab address@hidden @tab 
address@hidden @tab address@hidden
address@hidden Quadruple-precision floating-point @tab address@hidden @tab 
address@hidden @tab address@hidden
 @end ifnotinfo
 @end ifnottex
 @end multitable
@@ -31622,12 +31823,14 @@ You have to decide how small a delta is important to 
you. Code to do
 this looks something like the following:
 
 @example
address@hidden
 delta = 0.00001                 # for example
 difference = abs(a) - abs(b)    # subtract the two values
 if (difference < delta)
     # all ok
 else
     # not ok
address@hidden group
 @end example
 
 @noindent
@@ -32097,6 +32300,7 @@ choose to set:
 
 @example
 @c file eg/prog/pi.awk
address@hidden
 # pi.awk --- compute the digits of pi
 @c endfile
 @c endfile
@@ -32112,6 +32316,7 @@ choose to set:
 BEGIN @{
     digits = 100000
     two = 2 * 10 ^ digits
address@hidden group
     pi = two
     for (m = digits * 4; m > 0; --m) @{
         d = m * 2 + 1
@@ -33078,6 +33283,7 @@ of the function using the macro.
 For example, you might allocate a string value like so:
 
 @example
address@hidden
 awk_value_t result;
 char *message;
 const char greet[] = "Don't Panic!";
@@ -33085,8 +33291,10 @@ const char greet[] = "Don't Panic!";
 emalloc(message, char *, sizeof(greet), "myfunc");
 strcpy(message, greet);
 make_malloced_string(message, strlen(message), & result);
address@hidden group
 @end example
 
address@hidden 2
 @item #define ezalloc(pointer, type, size, message) @dots{}
 This is like @code{emalloc()}, but it calls @code{gawk_calloc()}
 instead of @code{gawk_malloc()}.
@@ -33222,6 +33430,7 @@ registering parts of your extension with @command{gawk}.
 Extension functions are described by the following record:
 
 @example
address@hidden
 typedef struct awk_ext_func @{
 @ @ @ @ const char *name;
 @ @ @ @ awk_value_t *(*const function)(int num_actual_args,
@@ -33232,6 +33441,7 @@ typedef struct awk_ext_func @{
 @ @ @ @ awk_bool_t suppress_lint;
 @ @ @ @ void *data;        /* opaque pointer to any extra state */
 @} awk_ext_func_t;
address@hidden group
 @end example
 
 The fields are:
@@ -33427,12 +33637,14 @@ Your extension should package these functions inside 
an
 @code{awk_input_parser_t}, which looks like this:
 
 @example
address@hidden
 typedef struct awk_input_parser @{
     const char *name;   /* name of parser */
     awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
     awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
     awk_const struct awk_input_parser *awk_const next;   /* for gawk */
 @} awk_input_parser_t;
address@hidden group
 @end example
 
 The fields are:
@@ -34185,6 +34397,7 @@ to a global variable or array. It is an optimization 
that
 avoids looking up variables in @command{gawk}'s symbol table every time
 access is needed. This was discussed earlier, in @ref{General Data Types}.
 
address@hidden 1500
 The following functions let you work with scalar cookies:
 
 @table @code
@@ -34247,12 +34460,14 @@ your extension's variable in @command{gawk}'s symbol 
table using
 using @code{sym_lookup()}:
 
 @example
address@hidden
 static awk_scalar_t magic_var_cookie;    /* cookie for MAGIC_VAR */
 
 static void
 my_extension_init()
 @{
     awk_value_t value;
address@hidden group
 
     /* install initial value */
     sym_update("MAGIC_VAR", make_number(42.0, & value));
@@ -34756,10 +34971,12 @@ Finally, because everything was successful, the 
function sets the
 return value to success, and returns:
 
 @example
address@hidden
     make_number(1.0, result);
 out:
     return result;
 @}
address@hidden group
 @end example
 
 Here is the output from running this part of the test:
@@ -34971,7 +35188,7 @@ BEGIN @{
 Here is the result of running the script:
 
 @example
-$ @kbd{AWKLIBPATH=$PWD ./gawk -f subarray.awk}
+$ @kbd{AWKLIBPATH=$PWD gawk -f subarray.awk}
 @print{} new_array["subarray"]["foo"] = bar
 @print{} new_array["hello"] = world
 @print{} new_array["answer"] = 42
@@ -35110,7 +35327,7 @@ It is up to the extension to decide if there are API 
incompatibilities.
 Typically, a check like this is enough:
 
 @example
-if (api->major_version != GAWK_API_MAJOR_VERSION
+if (   api->major_version != GAWK_API_MAJOR_VERSION
     || api->minor_version < GAWK_API_MINOR_VERSION) @{
         fprintf(stderr, "foo_extension: version mismatch with gawk!\n");
         fprintf(stderr, "\tmy version (%d, %d), gawk version (%d, %d)\n",
@@ -35211,10 +35428,12 @@ as described here.  The boilerplate needed is also 
provided in comments
 in the @file{gawkapi.h} header file:
 
 @example
address@hidden
 /* Boilerplate code: */
 int plugin_is_GPL_compatible;
 
 static gawk_api_t *const api;
address@hidden group
 static awk_ext_id_t ext_id;
 static const char *ext_version = NULL; /* or @dots{} = "some string" */
 
@@ -35615,10 +35834,12 @@ The second is a pointer to an @code{awk_value_t} 
structure, usually named
 @code{result}:
 
 @example
address@hidden
 /*  do_chdir --- provide dynamically loaded chdir() function for gawk */
 
 static awk_value_t *
 do_chdir(int nargs, awk_value_t *result, struct awk_ext_func *unused)
address@hidden group
 @{
     awk_value_t newdir;
     int ret = -1;
@@ -35745,7 +35966,7 @@ fill_stat_array(const char *name, awk_array_t array, 
struct stat *sbuf)
 #endif
 #ifdef S_IFDOOR /* Solaris weirdness */
         @{ S_IFDOOR, "door" @},
-#endif /* S_IFDOOR */
+#endif
     @};
     int j, k;
 @end example
@@ -35788,9 +36009,11 @@ certain members and/or the type of the file. It then 
returns zero,
 for success:
 
 @example
address@hidden
 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
     array_set_numeric(array, "blksize", sbuf->st_blksize);
-#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
+#endif
address@hidden group
 
     pmode = format_mode(sbuf->st_mode);
     array_set(array, "pmode", make_const_string(pmode, strlen(pmode),
@@ -35879,20 +36102,24 @@ Next, it gets the information for the file.  If the 
called function
 
     /* stat the file; if error, set ERRNO and return */
     ret = statfunc(name, & sbuf);
address@hidden
     if (ret < 0) @{
         update_ERRNO_int(errno);
         return make_number(ret, result);
     @}
address@hidden group
 @end example
 
 The tedious work is done by @code{fill_stat_array()}, shown
 earlier.  When done, the function returns the result from 
@code{fill_stat_array()}:
 
 @example
address@hidden
     ret = fill_stat_array(name, array, & sbuf);
 
     return make_number(ret, result);
 @}
address@hidden group
 @end example
 
 Finally, it's necessary to provide the ``glue'' that loads the
@@ -41586,14 +41813,24 @@ like this: @code{""}.
 
 Humans are used to working in decimal; i.e., base 10.  In base 10,
 numbers go from 0 to 9, and then ``roll over'' into the next
address@hidden
+column.  (Remember grade school? @math{42 = 4\times 10 + 2}.)
address@hidden iftex
address@hidden
 column.  (Remember grade school? 42 = 4 x 10 + 2.)
address@hidden ifnottex
 
 There are other number bases though.  Computers commonly use base 2
 or @dfn{binary}, base 8 or @dfn{octal}, and base 16 or @dfn{hexadecimal}.
 In binary, each column represents two times the value in the column to
 its right. Each column may contain either a 0 or a 1.
address@hidden
+Thus, binary 1010 represents @math{(1\times 8) + (0\times 4) + (1\times 2) + 
(0\times 1)}, or decimal 10.
address@hidden iftex
address@hidden
 Thus, binary 1010 represents (1 x 8) + (0 x 4) + (1 x 2)
 + (0 x 1), or decimal 10.
address@hidden ifnottex
 Octal and hexadecimal are discussed more in
 @ref{Nondecimal-numbers}.
 
@@ -41733,7 +41970,12 @@ electronic circuitry works ``naturally'' in base 2 
(just think of Off/On),
 everything inside a computer is calculated using base 2. Each digit
 represents the presence (or absence) of a power of 2 and is called a
 @dfn{bit}. So, for example, the base-two number @code{10101} is
address@hidden
+the same as decimal 21, (@math{(1\times 16) + (1\times 4) + (1\times 1)}).
address@hidden iftex
address@hidden
 the same as decimal 21, ((1 x 16) + (1 x 4) + (1 x 1)).
address@hidden ifnottex
 
 Since base-two numbers quickly become
 very long to read and write, they are usually grouped by 3 (i.e., they are
@@ -41904,7 +42146,7 @@ See also ``Interpreter.''
 @item Complemented Bracket Expression
 The negation of a @dfn{bracket expression}.  All that is @emph{not}
 described by a given bracket expression. The symbol @samp{^} precedes
-the negated bracket expression.  E.g.: @samp{[[^:digit:]}
+the negated bracket expression.  E.g.: @samp{[^[:digit:]]}
 designates whatever character is not a digit. @samp{[^bad]}
 designates whatever character is not one of the letters @samp{b}, @samp{a},
 or @samp{d}.
@@ -42173,7 +42415,12 @@ Base 16 notation, where the digits are @address@hidden 
and
 @address@hidden, with @samp{A}
 representing 10, @samp{B} representing 11, and so on, up to @samp{F} for 15.
 Hexadecimal numbers are written in C using a leading @samp{0x},
address@hidden
+to indicate their base.  Thus, @code{0x12} is 18 (@math{(1\times 16) + 2}).
address@hidden iftex
address@hidden
 to indicate their base.  Thus, @code{0x12} is 18 ((1 x 16) + 2).
address@hidden ifnottex
 @xref{Nondecimal-numbers}.
 
 @item I/O
@@ -42237,7 +42484,7 @@ meaning.  Keywords are reserved and may not be used as 
variable names.
 @code{break},
 @code{case},
 @code{continue},
address@hidden
address@hidden,
 @code{delete},
 @address@hidden,
 @code{else},
@@ -42323,7 +42570,12 @@ Ancient @command{awk} implementations used single 
precision floating-point.
 @item Octal
 Base-eight notation, where the digits are @address@hidden
 Octal numbers are written in C using a leading @samp{0},
address@hidden
+to indicate their base.  Thus, @code{013} is 11 (@math{(1\times 8) + 3}).
address@hidden iftex
address@hidden
 to indicate their base.  Thus, @code{013} is 11 ((1 x 8) + 3).
address@hidden ifnottex
 @xref{Nondecimal-numbers}.
 
 @item Output Record
diff --git a/doc/gawktexi.in b/doc/gawktexi.in
index 08a6396..7596bd9 100644
--- a/doc/gawktexi.in
+++ b/doc/gawktexi.in
@@ -1494,9 +1494,11 @@ default @command{awk} utility. A more modern 
@command{awk} lives in
 if you try the test program:
 
 @example
address@hidden
 $ @kbd{awk 1 /dev/null}
 @error{} awk: syntax error near line 1
 @error{} awk: bailing out near line 1
address@hidden group
 @end example
 
 @noindent
@@ -2901,10 +2903,12 @@ for the
 single- and double-quote characters, like so:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{ print "Here is a single quote <\47>" @}'}
 @print{} Here is a single quote <'>
 $ @kbd{awk 'BEGIN @{ print "Here is a double quote <\42>" @}'}
 @print{} Here is a double quote <">
address@hidden group
 @end example
 
 @noindent
@@ -3176,8 +3180,10 @@ action---so it uses the default action, printing the 
record.
 Print the length of the longest input line:
 
 @example
address@hidden
 awk '@{ if (length($0) > max) max = length($0) @}
      END @{ print max @}' data
address@hidden group
 @end example
 
 The code associated with @code{END} executes after all
@@ -3494,11 +3500,13 @@ starts a comment, it ignores @emph{everything} on the 
rest of the
 line. For example:
 
 @example
address@hidden
 $ @kbd{gawk 'BEGIN @{ print "dont panic" # a friendly \}
 > @kbd{                                   BEGIN rule}
 > @address@hidden'}
 @error{} gawk: cmd. line:2:                BEGIN rule
 @error{} gawk: cmd. line:2:                ^ syntax error
address@hidden group
 @end example
 
 @noindent
@@ -4695,10 +4703,12 @@ The files to be included may be nested; e.g., given a 
third
 script, namely @file{test3}:
 
 @example
address@hidden
 @@include "test2"
 BEGIN @{
     print "This is script test3."
 @}
address@hidden group
 @end example
 
 @noindent
@@ -4785,8 +4795,10 @@ $ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
 This is equivalent to the following example:
 
 @example
address@hidden
 $ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
 @print{} A
address@hidden group
 @end example
 
 @noindent
@@ -6282,8 +6294,10 @@ with each @samp{u} changed to a newline.  Here are the 
results of running
 the program on @file{mail-list}:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{ RS = "u" @}}
 >      @address@hidden print $0 @}' mail-list}
address@hidden group
 @print{} Amelia       555-5553     amelia.zodiac
 @print{} sq
 @print{} e@@gmail.com    F
@@ -6440,9 +6454,11 @@ matches either a newline or a series of one or more 
uppercase letters
 with optional leading and/or trailing whitespace:
 
 @example
address@hidden
 $ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
 > @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
 >             @address@hidden print "Record =", $0,"and RT = [" RT "]" @}'}
address@hidden group
 @print{} Record = record 1 and RT = [ AAAA ]
 @print{} Record = record 2 and RT = [ BBBB ]
 @print{} Record = record 3 and RT = [
@@ -6826,8 +6842,10 @@ values of the fields and @code{OFS}.  To do this, use the
 seemingly innocuous assignment:
 
 @example
address@hidden
 $1 = $1   # force record to be reconstituted
 print $0  # or whatever else with $0
address@hidden group
 @end example
 
 @noindent
@@ -7596,16 +7614,20 @@ Putting this to use, here is a simple program to parse 
the data:
 
 @example
 @c file eg/misc/simple-csv.awk
address@hidden
 BEGIN @{
     FPAT = "([^,]+)|(\"[^\"]+\")"
 @}
address@hidden group
 
address@hidden
 @{
     print "NF = ", NF
     for (i = 1; i <= NF; i++) @{
         printf("$%d = <%s>\n", i, $i)
     @}
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -8046,6 +8068,7 @@ read-a-line-and-check-each-rule loop of @command{awk} 
never sees it.
 The following example swaps every two lines of input:
 
 @example
address@hidden
 @{
      if ((getline tmp) > 0) @{
           print tmp
@@ -8053,6 +8076,7 @@ The following example swaps every two lines of input:
      @} else
           print $0
 @}
address@hidden group
 @end example
 
 @noindent
@@ -8195,6 +8219,7 @@ lines that begin with @samp{@@execute}, which are 
replaced by the output
 produced by running the rest of the line as a shell command:
 
 @example
address@hidden
 @{
      if ($1 == "@@execute") @{
           tmp = substr($0, 10)        # Remove "@@execute"
@@ -8204,6 +8229,7 @@ produced by running the rest of the line as a shell 
command:
      @} else
           print
 @}
address@hidden group
 @end example
 
 @noindent
@@ -8507,12 +8533,14 @@ For example, a TCP client can decide to give up on 
receiving
 any response from the server after a certain amount of time:
 
 @example
address@hidden
 Service = "/inet/tcp/0/localhost/daytime"
 PROCINFO[Service, "READ_TIMEOUT"] = 100
 if ((Service |& getline) > 0)
     print $0
 else if (ERRNO != "")
     print ERRNO
address@hidden group
 @end example
 
 Here is how to read interactively from the address@hidden assumes
@@ -8854,10 +8882,12 @@ newlines:
 @end ifnotinfo
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{ print "line one\nline two\nline three" @}'}
 @print{} line one
 @print{} line two
 @print{} line three
address@hidden group
 @end example
 
 @cindex fields, printing
@@ -9109,12 +9139,14 @@ The output separator variables @code{OFS} and 
@code{ORS} have no effect
 on @code{printf} statements. For example:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{}
 >    @kbd{ORS = "\nOUCH!\n"; OFS = "+"}
 >    @kbd{msg = "Don\47t Panic!"}
 >    @kbd{printf "%s\n", msg}
 > @address@hidden'}
 @print{} Don't Panic!
address@hidden group
 @end example
 
 @noindent
@@ -9637,9 +9669,11 @@ alone for now and let's hope no-one notices.
 @end ignore
 
 @example
address@hidden
 awk '@{ print $1 > "names.unsorted"
        command = "sort -r > names.sorted"
        print $1 | command @}' mail-list
address@hidden group
 @end example
 
 The unsorted list is written with an ordinary redirection, while
@@ -9933,7 +9967,7 @@ The @var{protocol} is one of @samp{tcp} or @samp{udp},
 and the other fields represent the other essential pieces of information
 for making a networking connection.
 These @value{FN}s are used with the @samp{|&} operator for communicating
-with a coprocess
+with @w{a coprocess}
 (@pxref{Two-way I/O}).
 This is an advanced feature, mentioned here only for completeness.
 Full discussion is delayed until
@@ -10032,10 +10066,14 @@ it is good practice to use a variable to store the 
@value{FN} or command.
 The previous example becomes the following:
 
 @example
address@hidden
 sortcom = "sort -r names"
 sortcom | getline foo
address@hidden group
address@hidden
 @dots{}
 close(sortcom)
address@hidden group
 @end example
 
 @noindent
@@ -10178,7 +10216,7 @@ if it fails.
 
 @float Table,table-close-pipe-return-values
 @caption{Return values from @code{close()} of a pipe}
address@hidden @columnfractions .40 .60
address@hidden @columnfractions .50 .50
 @headitem Situation @tab Return value from @code{close()}
 @item Normal exit of command @tab Command's exit status
 @item Death by signal of command @tab 256 + number of murderous signal
@@ -10207,7 +10245,8 @@ disk) is a fatal error.
 
 @example
 $ @kbd{gawk 'BEGIN @{ print "hi" > "/no/such/file" @}'}
address@hidden gawk: cmd. line:1: fatal: can't redirect to `/no/such/file' (No 
such file or directory)
address@hidden gawk: cmd. line:1: fatal: can't redirect to `/no/such/file' (No
address@hidden such file or directory)
 @end example
 
 @command{gawk} makes it possible to detect that an error has
@@ -10638,6 +10677,7 @@ confusion can arise when attempting to use regexp 
constants as arguments
 to user-defined functions (@pxref{User-defined}).  For example:
 
 @example
address@hidden
 function mysub(pat, repl, str, global)
 @{
     if (global)
@@ -10646,13 +10686,16 @@ function mysub(pat, repl, str, global)
         sub(pat, repl, str)
     return str
 @}
address@hidden group
 
address@hidden
 @{
     @dots{}
     text = "hi! hi yourself!"
     mysub(/hi/, "howdy", text, 1)
     @dots{}
 @}
address@hidden group
 @end example
 
 @c @cindex automatic warnings
@@ -10900,8 +10943,10 @@ is performed.  If numeric values appear in string 
concatenation, they
 are converted to strings.  Consider the following:
 
 @example
address@hidden
 two = 2; three = 3
 print (two three) + 4
address@hidden group
 @end example
 
 @noindent
@@ -11374,10 +11419,14 @@ to it.  In the following program fragment, the 
variable
 @code{foo} has a numeric value at first, and a string value later on:
 
 @example
address@hidden
 foo = 1
 print foo
address@hidden group
address@hidden
 foo = "bar"
 print foo
address@hidden group
 @end example
 
 @noindent
@@ -11449,16 +11498,20 @@ righthand expression.  For example:
 
 @cindex Rankin, Pat
 @example
address@hidden
 # Thanks to Pat Rankin for this example
 BEGIN  @{
     foo[rand()] += 5
     for (x in foo)
        print x, foo[x]
address@hidden group
 
address@hidden
     bar[rand()] = bar[rand()] + 5
     for (x in bar)
        print x, bar[x]
 @}
address@hidden group
 @end example
 
 @cindex operators, assignment, evaluation order
@@ -12134,10 +12187,12 @@ leave off one of the @samp{=} characters.  The result 
is still valid
 @command{awk} code, but the program does not do what is intended:
 
 @example
address@hidden
 if (a = b)   # oops! should be a == b
    @dots{}
 else
    @dots{}
address@hidden group
 @end example
 
 @noindent
@@ -13089,8 +13144,10 @@ $ @kbd{awk '! /li/' mail-list}
 @print{} Bill         555-1675     bill.drowning@@hotmail.com       A
 @print{} Camilla      555-2912     camilla.infusarum@@skynet.be     R
 @print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
address@hidden
 @print{} Martin       555-6480     martin.codicibus@@hotmail.com    A
 @print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
address@hidden group
 @end example
 
 @cindex @code{BEGIN} pattern, Boolean patterns and
@@ -13481,10 +13538,12 @@ the variable's value into the program inside the 
script.
 For example, consider the following program:
 
 @example
address@hidden
 printf "Enter search pattern: "
 read pattern
 awk "/$pattern/ "'@{ nmatches++ @}
      END @{ print nmatches, "found" @}' /path/to/data
address@hidden group
 @end example
 
 @noindent
@@ -13673,10 +13732,12 @@ the null string; otherwise, the condition is true.
 Refer to the following:
 
 @example
address@hidden
 if (x % 2 == 0)
     print "x is even"
 else
     print "x is odd"
address@hidden group
 @end example
 
 In this example, if the expression @samp{x % 2 == 0} is true (i.e.,
@@ -13998,6 +14059,7 @@ finds the smallest divisor of any integer, and also 
identifies prime
 numbers:
 
 @example
address@hidden
 # find smallest divisor of num
 @{
     num = $1
@@ -14005,11 +14067,14 @@ numbers:
         if (num % divisor == 0)
             break
     @}
address@hidden group
address@hidden
     if (num % divisor == 0)
         printf "Smallest divisor of %d is %d\n", num, divisor
     else
         printf "%d is prime\n", num
 @}
address@hidden group
 @end example
 
 When the remainder is zero in the first @code{if} statement, @command{awk}
@@ -14317,14 +14382,18 @@ using an @code{exit} statement with a nonzero 
argument, as shown
 in the following example:
 
 @example
address@hidden
 BEGIN @{
     if (("date" | getline date_now) <= 0) @{
         print "Can't get system date" > "/dev/stderr"
         exit 1
     @}
address@hidden group
address@hidden
     print "current date is", date_now
     close("date")
 @}
address@hidden group
 @end example
 
 @quotation NOTE
@@ -14622,6 +14691,7 @@ Unlike most @command{awk} arrays,
 In the following example:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{}
 >         @kbd{for (i = 0; i < ARGC; i++)}
 >             @kbd{print ARGV[i]}
@@ -14629,6 +14699,7 @@ $ @kbd{awk 'BEGIN @{}
 @print{} awk
 @print{} inventory-shipped
 @print{} mail-list
address@hidden group
 @end example
 
 @noindent
@@ -15053,12 +15124,14 @@ points out that it effectively gives @command{awk} 
data pointers. Consider his
 example:
 
 @example
address@hidden
 # Indirect multiply of any variable by amount, return result
 
 function multiply(variable, amount)
 @{
     return SYMTAB[variable] *= amount
 @}
address@hidden group
 @end example
 
 @noindent
@@ -15130,6 +15203,7 @@ presented the following program describing the 
information contained in @code{AR
 and @code{ARGV}:
 
 @example
address@hidden
 $ @kbd{awk 'BEGIN @{}
 >        @kbd{for (i = 0; i < ARGC; i++)}
 >            @kbd{print ARGV[i]}
@@ -15137,6 +15211,7 @@ $ @kbd{awk 'BEGIN @{}
 @print{} awk
 @print{} inventory-shipped
 @print{} mail-list
address@hidden group
 @end example
 
 @noindent
@@ -15733,8 +15808,10 @@ For example, this statement tests whether the array 
@code{frequencies}
 contains the index @samp{2}:
 
 @example
address@hidden
 if (2 in frequencies)
     print "Subscript 2 is present."
address@hidden group
 @end example
 
 Note that this is @emph{not} a test of whether the array
@@ -15744,8 +15821,10 @@ There is no way to do that except to scan all the 
elements.  Also, this
 (incorrect) alternative does:
 
 @example
address@hidden
 if (frequencies[2] != "")
     print "Subscript 2 is present."
address@hidden group
 @end example
 
 @node Assigning Elements
@@ -15802,6 +15881,7 @@ all the lines.
 When this program is run with the following input:
 
 @example
address@hidden
 @c file eg/misc/arraymax.data
 5  I am the Five man
 2  Who are you?  The new number two!
@@ -15809,17 +15889,20 @@ When this program is run with the following input:
 1  Who is number one?
 3  I three you.
 @c endfile
address@hidden group
 @end example
 
 @noindent
 Its output is:
 
 @example
address@hidden
 1  Who is number one?
 2  Who are you?  The new number two!
 3  I three you.
 4  . . . And four on the floor
 5  I am the Five man
address@hidden group
 @end example
 
 If a line number is repeated, the last line with a given number overrides
@@ -15828,11 +15911,13 @@ Gaps in the line numbers can be handled with an easy 
improvement to the
 program's @code{END} rule, as follows:
 
 @example
address@hidden
 END @{
     for (x = 1; x <= max; x++)
         if (x in arr)
             print arr[x]
 @}
address@hidden group
 @end example
 
 @node Scanning an Array
@@ -15852,8 +15937,10 @@ So @command{awk} has a special kind of @code{for} 
statement for scanning
 an array:
 
 @example
address@hidden
 for (@var{var} in @var{array})
     @var{body}
address@hidden group
 @end example
 
 @noindent
@@ -15874,12 +15961,15 @@ such words.
 for more information on the built-in function @code{length()}.
 
 @example
address@hidden
 # Record a 1 for each word that is used at least once
 @{
     for (i = 1; i <= NF; i++)
         used[$i] = 1
 @}
address@hidden group
 
address@hidden
 # Find number of distinct words more than 10 characters long
 END @{
     for (x in used) @{
@@ -15890,6 +15980,7 @@ END @{
     @}
     print num_long_words, "words longer than 10 characters"
 @}
address@hidden group
 @end example
 
 @noindent
@@ -16277,9 +16368,11 @@ same as assigning it a null value (the empty string, 
@code{""}).
 For example:
 
 @example
address@hidden
 foo[4] = ""
 if (4 in foo)
   print "This is printed, even though foo[4] is empty"
address@hidden group
 @end example
 
 @cindex lint checking, array elements
@@ -16434,22 +16527,26 @@ END @{
 When given the input:
 
 @example
address@hidden
 1 2 3 4 5 6
 2 3 4 5 6 1
 3 4 5 6 1 2
 4 5 6 1 2 3
address@hidden group
 @end example
 
 @noindent
 the program produces the following output:
 
 @example
address@hidden
 4 3 2 1
 5 4 3 2
 6 5 4 3
 1 6 5 4
 2 1 6 5
 3 2 1 6
address@hidden group
 @end example
 
 @node Multiscanning
@@ -16629,15 +16726,19 @@ you can often devise workarounds using control 
statements. For example,
 the following code prints the elements of our main array @code{a}:
 
 @example
address@hidden
 for (i in a) @{
     for (j in a[i]) @{
         if (j == 3) @{
             for (k in a[i][j])
                 print a[i][j][k]
address@hidden group
address@hidden
         @} else
             print a[i][j]
     @}
 @}
address@hidden group
 @end example
 
 @noindent
@@ -17087,9 +17188,11 @@ asort(a)
 results in the following contents of @code{a}:
 
 @example
address@hidden
 a[1] = "cul"
 a[2] = "de"
 a[3] = "sac"
address@hidden group
 @end example
 
 The @code{asorti()} function works similarly to @code{asort()}; however,
@@ -18145,6 +18248,9 @@ a file or pipe that was opened for reading (such as 
with @code{getline}),
 or if @var{filename} is not an open file, pipe, or coprocess.
 In such a case, @code{fflush()} returns @minus{}1, as well.
 
address@hidden end the table to let the sidebar take up the full width of the 
page.
address@hidden table
+
 @sidebar Interactive Versus Noninteractive Buffering
 @cindex buffering, interactive vs.@: noninteractive
 
@@ -18188,6 +18294,7 @@ Here, no output is printed until after the @kbd{Ctrl-d} 
is typed, because
 it is all buffered and sent down the pipe to @command{cat} in one shot.
 @end sidebar
 
address@hidden @asis
 @item @code{system(@var{command})}
 @cindexawkfunc{system}
 @cindex invoke shell command
@@ -18909,7 +19016,7 @@ that illustrates the use of these functions:
 @example
 @group
 @c file eg/lib/bits2str.awk
-# bits2str --- turn a byte into readable ones and zeros
+# bits2str --- turn an integer into readable ones and zeros
 
 function bits2str(bits,        data, mask)
 @{
@@ -18931,7 +19038,7 @@ function bits2str(bits,        data, mask)
 @c this is a hack to make testbits.awk self-contained
 @ignore
 @c file eg/prog/testbits.awk
-# bits2str --- turn a byte into readable 1's and 0's
+# bits2str --- turn an integer into readable ones and zeros
 
 function bits2str(bits,        data, mask)
 @{
@@ -18972,7 +19079,8 @@ $ @kbd{gawk -f testbits.awk}
 @print{} 123 = 01111011
 @print{} 0123 = 01010011
 @print{} 0x99 = 10011001
address@hidden compl(0x99) = 0x3fffffffffff66 = 
00111111111111111111111111111111111111111111111101100110
address@hidden compl(0x99) = 0x3fffffffffff66 =
address@hidden 00111111111111111111111111111111111111111111111101100110
 @print{} lshift(0x99, 2) = 0x264 = 0000001001100100
 @print{} rshift(0x99, 2) = 0x26 = 00100110
 @end example
@@ -19243,10 +19351,12 @@ entire program before starting to execute any of it.
 The definition of a function named @var{name} looks like this:
 
 @display
address@hidden
 @code{function} @address@hidden(address@hidden@code{)}
 @address@hidden
      @var{body-of-function}
 @address@hidden
address@hidden group
 @end display
 
 @cindex names, functions
@@ -19414,11 +19524,13 @@ This function deletes all the elements in an array 
(recall that the
 extra whitespace signifies the start of the local variable list):
 
 @example
address@hidden
 function delarray(a,    i)
 @{
     for (i in a)
         delete a[i]
 @}
address@hidden group
 @end example
 
 When working with arrays, it is often necessary to delete all the elements
@@ -19625,10 +19737,12 @@ In addition, recursive calls create new arrays.
 Consider this example:
 
 @example
address@hidden
 function some_func(p1,      a)
 @{
     if (p1++ > 3)
         return
address@hidden group
 
     a[p1] = p1
 
@@ -19692,12 +19806,14 @@ this has no effect on any other variables.  Thus, if 
@code{myfunc()}
 does this:
 
 @example
address@hidden
 function myfunc(str)
 @{
    print str
    str = "zzz"
    print str
 @}
address@hidden group
 @end example
 
 @noindent
@@ -19853,11 +19969,13 @@ function maxelt(vec,   i, ret)
      return ret
 @}
 
address@hidden
 # Load all fields of each record into nums.
 @{
      for(i = 1; i <= NF; i++)
           nums[NR, i] = $i
 @}
address@hidden group
 
 END @{
      print maxelt(nums)
@@ -20151,12 +20269,14 @@ first thing to do is write some comparison functions:
 
 @example
 @c file eg/prog/indirectcall.awk
address@hidden
 # num_lt --- do a numeric less than comparison
 
 function num_lt(left, right)
 @{
     return ((left + 0) < (right + 0))
 @}
address@hidden group
 
 # num_ge --- do a numeric greater than or equal to comparison
 
@@ -20205,19 +20325,23 @@ names of the two comparison functions:
 
 @example
 @c file eg/prog/indirectcall.awk
address@hidden
 # sort --- sort the data in ascending order and return it as a string
 
 function sort(first, last)
 @{
     return do_sort(first, last, "num_lt")
 @}
address@hidden group
 
address@hidden
 # rsort --- sort the data in descending order and return it as a string
 
 function rsort(first, last)
 @{
     return do_sort(first, last, "num_ge")
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -20717,6 +20841,7 @@ been true but was not, and then it kills the program.  
In C, using
 @code{assert()} looks this:
 
 @example
address@hidden
 #include <assert.h>
 
 int myfunc(int a, double b)
@@ -20724,6 +20849,7 @@ int myfunc(int a, double b)
      assert(a <= 5 && b >= 17.1);
      @dots{}
 @}
address@hidden group
 @end example
 
 If the assertion fails, the program prints a message similar to this:
@@ -20881,9 +21007,10 @@ function round(x,   ival, aval, fraction)
 @}
 @c endfile
 @c don't include test harness in the file that gets installed
-
address@hidden
 # test harness
 # @{ print $0, round($0) @}
address@hidden group
 @end example
 
 @node Cliff Random Function
@@ -21289,7 +21416,7 @@ if (length(contents) == 0)
 @end example
 
 This tests the result to see if it is empty or not. An equivalent
-test would be @samp{contents == ""}.
+test would be @address@hidden == ""}}.
 
 @xref{Extension Sample Readfile} for an extension function that
 also reads an entire file into memory.
@@ -21590,8 +21717,10 @@ $ @kbd{gawk -f rewind.awk -f test.awk data }
 @print{} data 1 a
 @print{} data 2 b
 @print{} data 3 c
address@hidden
 @print{} data 4 d
 @print{} data 5 e
address@hidden group
 @end example
 
 @node File Checking
@@ -22806,8 +22935,10 @@ function getgrent()
     _gr_init()
     if (++_gr_count in _gr_bycount)
         return _gr_bycount[_gr_count]
address@hidden
     return ""
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -23337,10 +23468,12 @@ list of fields or characters:
     if (by_fields == 0 && by_chars == 0)
         by_fields = 1    # default
 
address@hidden
     if (fieldlist == "") @{
         print "cut: needs list for -c or -f" > "/dev/stderr"
         exit 1
     @}
address@hidden group
 
     if (by_fields)
         set_fieldlist()
@@ -23681,8 +23814,10 @@ function endfile(file)
             print fcount
     @}
 
address@hidden
     total += fcount
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -23839,11 +23974,15 @@ BEGIN @{
     pw = getpwuid(uid)
     pr_first_field(pw)
 
address@hidden
     if (euid != uid) @{
         printf(" euid=%d", euid)
         pw = getpwuid(euid)
address@hidden group
address@hidden
         pr_first_field(pw)
     @}
address@hidden group
 
     printf(" gid=%d", gid)
     pw = getgrgid(gid)
@@ -23971,14 +24110,17 @@ BEGIN @{
     # test argv in case reading from stdin instead of file
     if (i in ARGV)
         i++    # skip datafile name
address@hidden
     if (i in ARGV) @{
         outfile = ARGV[i]
         ARGV[i] = ""
     @}
-
address@hidden group
address@hidden
     s1 = s2 = "a"
     out = (outfile s1 s2)
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -24134,11 +24276,15 @@ line into each file on the command line, and then to 
the standard output:
 It is also possible to write the loop this way:
 
 @example
address@hidden
 for (i in copy)
     if (append)
         print >> copy[i]
address@hidden group
address@hidden
     else
         print > copy[i]
address@hidden group
 @end example
 
 @noindent
@@ -24289,10 +24435,12 @@ BEGIN @{
             usage()
     @}
 
address@hidden
     if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
         charcount = substr(ARGV[Optind], 2) + 0
         Optind++
     @}
address@hidden group
 
     for (i = 1; i < Optind; i++)
         ARGV[i] = ""
@@ -24326,10 +24474,12 @@ strings are then compared and @code{are_equal()} 
returns the result:
 
 @example
 @c file eg/prog/uniq.awk
address@hidden
 function are_equal(    n, m, clast, cline, alast, aline)
 @{
     if (fcount == 0 && charcount == 0)
         return (last == $0)
address@hidden group
 
     if (fcount > 0) @{
         n = split(last, alast)
@@ -24344,9 +24494,11 @@ function are_equal(    n, m, clast, cline, alast, 
aline)
         clast = substr(clast, charcount + 1)
         cline = substr(cline, charcount + 1)
     @}
address@hidden
 
     return (clast == cline)
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -24405,11 +24557,13 @@ NR == 1 @{
 END @{
     if (do_count)
         printf("%4d %s\n", count, last) > outputfile
address@hidden
     else if ((repeated_only && count > 1) ||
             (non_repeated_only && count == 1))
         print last > outputfile
     close(outputfile)
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -25204,10 +25358,12 @@ At first glance, a program like this would seem to do 
the job:
         freq[$i]++
 @}
 
address@hidden
 END @{
     for (word in freq)
         printf "%s\t%d\n", word, freq[word]
 @}
address@hidden group
 @end example
 
 The program relies on @command{awk}'s default field-splitting
@@ -25597,9 +25753,11 @@ line.  That line is then printed to the output file:
                     i++
             @}
         @}
address@hidden
         print join(a, 1, n, SUBSEP) > curfile
     @}
 @}
address@hidden group
 @c endfile
 @end example
 
@@ -25685,10 +25843,12 @@ function usage()
     exit 1
 @}
 
address@hidden
 BEGIN @{
     # validate arguments
     if (ARGC < 3)
         usage()
address@hidden group
 
     RS = ARGV[1]
     ORS = ARGV[2]
@@ -26082,13 +26242,11 @@ the program is done:
                 continue
             @}
             fpath = pathto($2)
address@hidden
             if (fpath == "") @{
                 printf("igawk: %s:%d: cannot find %s\n",
                     input[stackptr], FNR, $2) > "/dev/stderr"
                 continue
             @}
address@hidden group
             if (! (fpath in processed)) @{
                 processed[fpath] = input[stackptr]
                 input[++stackptr] = fpath  # push onto stack
@@ -26345,10 +26503,12 @@ notice and this notice are preserved.
 Here is the program:
 
 @example
address@hidden
 awk 'address@hidden"~"~"~";o="=="=="==";o+=+o;x=O""O;while(X++<=x+o+o)c=c"%c";
 printf c,(x-O)*(x-O),x*(x-o)-o,x*(x-O)+x-O-o,+x*(x-O)-x+o,X*(o*o+O)+x-O,
 X*(X-x)-o*o,(x+X)*o*o+o,x*(X-x)-O-O,x-O+(O+o+X+x)*(o+O),X*X-X*(x-O)-x+O,
 
O+X*(o*(o+O)+O),+x+O+X*o,x*(x-o),(o+X+x)*o*o-(x-O-O),O+(X-x)*(X+O),address@hidden'
address@hidden group
 @end example
 
 @cindex Johansen, Chris
@@ -26836,11 +26996,13 @@ Our first comparison function can be used to scan an 
array in
 numerical order of the indices:
 
 @example
address@hidden
 function cmp_num_idx(i1, v1, i2, v2)
 @{
      # numerical index comparison, ascending order
      return (i1 - i2)
 @}
address@hidden group
 @end example
 
 Our second function traverses an array based on the string order of
@@ -26945,10 +27107,13 @@ function cmp_field(i1, v1, i2, v2)
         a[NR][i] = $i
 @}
 
address@hidden
 END @{
     PROCINFO["sorted_in"] = "cmp_field"
address@hidden group
     if (POS < 1 || POS > NF)
         POS = 1
+
     for (i in a) @{
         for (j = 1; j <= NF; j++)
             printf("%s%c", a[i][j], j < NF ? ":" : "")
@@ -27005,6 +27170,7 @@ function cmp_numeric(i1, v1, i2, v2)
     return (v1 != v2) ? (v2 - v1) : (i2 - i1)
 @}
 
address@hidden
 function cmp_string(i1, v1, i2, v2)
 @{
     # string value (and index) comparison, descending order
@@ -27012,6 +27178,7 @@ function cmp_string(i1, v1, i2, v2)
     v2 = v2 i2
     return (v1 > v2) ? -1 : (v1 != v2)
 @}
address@hidden group
 @end example
 
 @c Avoid using the term ``stable'' when describing the unpredictable behavior
@@ -27165,11 +27332,13 @@ The following example demonstrates the use of a 
comparison function with
 both values to lowercase in order to compare them ignoring case.
 
 @example
address@hidden
 # case_fold_compare --- compare as strings, ignoring case
 
 function case_fold_compare(i1, v1, i2, v2,    l, r)
 @{
     l = tolower(v1)
address@hidden group
     r = tolower(v2)
 
     if (l < r)
@@ -28526,8 +28695,10 @@ This is somewhat counterintuitive.
 and those with positional specifiers in the same string:
 
 @example
address@hidden
 $ @kbd{gawk 'BEGIN @{ printf "%d %3$s\n", 1, 2, "hi" @}'}
 @error{} gawk: cmd. line:1: fatal: must use `count$' on all formats or none
address@hidden group
 @end example
 
 @quotation NOTE
@@ -29152,8 +29323,10 @@ be inside this function.  To investigate further, we 
must begin
 @samp{n} (for ``next''):
 
 @example
address@hidden
 gawk> @kbd{n}
 @print{} 66          if (fcount > 0) @{
address@hidden group
 @end example
 
 This tells us that @command{gawk} is now ready to execute line 66, which
@@ -29922,10 +30095,12 @@ partial dump of Davide Brini's obfuscated code
 
 @c FIXME: This will need updating if num-handler branch is ever merged in.
 @smallexample
address@hidden
 gawk> @kbd{dump}
 @print{}        # BEGIN
 @print{}
 @print{} [  1:0xfcd340] Op_rule           : [in_rule = BEGIN] [source_file = 
brini.awk]
address@hidden group
 @print{} [  1:0xfcc240] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
 @print{} [  1:0xfcc2a0] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
 @print{} [  1:0xfcc280] Op_match          :
@@ -29958,18 +30133,18 @@ gawk> @kbd{dump}
 @print{} [   :0xfcc660] Op_no_op          :
 @print{} [  1:0xfcc520] Op_assign_concat  : c
 @print{} [   :0xfcc620] Op_jmp            : [target_jmp = 0xfcc440]
address@hidden
 @dots{}
address@hidden
 @print{} [     2:0xfcc5a0] Op_K_printf         : [expr_count = 17] [redir_type 
= ""]
 @print{} [      :0xfcc140] Op_no_op            :
 @print{} [      :0xfcc1c0] Op_atexit           :
 @print{} [      :0xfcc640] Op_stop             :
 @print{} [      :0xfcc180] Op_no_op            :
 @print{} [      :0xfcd150] Op_after_beginfile  :
address@hidden
 @print{} [      :0xfcc160] Op_no_op            :
 @print{} [      :0xfcc1a0] Op_after_endfile    :
 gawk>
address@hidden group
 @end smallexample
 
 @cindex @code{exit} debugger command
@@ -30324,6 +30499,7 @@ In computer systems, integer arithmetic is exact, but 
the possible
 range of values is limited.  Integer arithmetic is generally faster than
 floating-point arithmetic.
 
address@hidden floating-point, numbers
 @item Floating-point arithmetic
 Floating-point numbers represent what were called in school ``real''
 numbers (i.e., those that have a fractional part, such as 3.1415927).
@@ -30335,6 +30511,12 @@ Modern systems support floating-point arithmetic in 
hardware, with a
 limited range of values.  There are software libraries that allow
 the use of arbitrary-precision floating-point calculations.
 
address@hidden floating-point, address@hidden single-precision
address@hidden floating-point, address@hidden double-precision
address@hidden floating-point, address@hidden arbitrary-precision
address@hidden single-precision
address@hidden double-precision
address@hidden arbitrary-precision
 POSIX @command{awk} uses @dfn{double-precision} floating-point numbers, which
 can hold more digits than @dfn{single-precision} floating-point numbers.
 @command{gawk} has facilities for performing arbitrary-precision
@@ -30344,29 +30526,48 @@ floating-point arithmetic, which we describe in more 
detail shortly.
 Computers work with integer and floating-point values of different
 ranges. Integer values are usually either 32 or 64 bits in size.
 Single-precision floating-point values occupy 32 bits, whereas double-precision
-floating-point values occupy 64 bits.  Floating-point values are always
-signed. The possible ranges of values are shown in @ref{table-numeric-ranges}.
+floating-point values occupy 64 bits.
+(Quadruple-precision floating point values also exist. They occupy 128 bits,
+but such numbers are not available in @command{awk}.)
+Floating-point values are always
+signed. The possible ranges of values are shown in @ref{table-numeric-ranges}
+and @ref{table-floating-point-ranges}.
 
 @float Table,table-numeric-ranges
address@hidden ranges for different numeric representations}
address@hidden ranges for integer representations}
 @multitable @columnfractions .34 .33 .33
address@hidden Numeric representation @tab Minimum value @tab Maximum value
address@hidden Representation @tab Minimum value @tab Maximum value
 @item 32-bit signed integer @tab @minus{}2,147,483,648 @tab 2,147,483,647
 @item 32-bit unsigned integer @tab 0 @tab 4,294,967,295
 @item 64-bit signed integer @tab @minus{}9,223,372,036,854,775,808 @tab 
9,223,372,036,854,775,807
 @item 64-bit unsigned integer @tab 0 @tab 18,446,744,073,709,551,615
address@hidden multitable
address@hidden float
+
address@hidden Table,table-floating-point-ranges
address@hidden value ranges for floating-point number representations}
address@hidden @columnfractions .38 .22 .22 .23
 @iftex
address@hidden Single-precision floating point (approximate) @tab 
@math{1.175494^{-38}} @tab @math{3.402823^{38}}
address@hidden Double-precision floating point (approximate) @tab 
@math{2.225074^{-308}} @tab @math{1.797693^{308}}
address@hidden Representation @tab @w{Minimum positive} @w{nonzero value} @tab 
Minimum @w{finite value} @tab Maximum @w{finite value}
address@hidden iftex
address@hidden
address@hidden Representation @tab Minimum positive nonzero value @tab Minimum 
finite value @tab Maximum finite value
address@hidden ifnottex
address@hidden
address@hidden @w{Single-precision floating-point} @tab @math{1.175494 @cdot 
10^{-38}} @tab @math{-3.402823 @cdot 10^{38}} @tab @math{3.402823 @cdot 10^{38}}
address@hidden @w{Double-precision floating-point} @tab @math{2.225074 @cdot 
10^{-308}} @tab @math{-1.797693 @cdot 10^{308}} @tab @math{1.797693 @cdot 
10^{308}}
address@hidden @w{Quadruple-precision floating-point} @tab @math{3.362103 @cdot 
10^{-4932}} @tab @math{-1.189731 @cdot 10^{4932}} @tab @math{1.189731 @cdot 
10^{4932}}
 @end iftex
 @ifinfo
address@hidden Single-precision floating point (approximate) @tab 1.175494e-38 
@tab 3.402823e38
address@hidden Double-precision floating point (approximate) @tab 2.225074e-308 
@tab 1.797693e308
address@hidden Single-precision floating-point @tab 1.175494e-38 @tab 
-3.402823e+38 @tab 3.402823e+38
address@hidden Double-precision floating-point @tab 2.225074e-308 @tab 
-1.797693e+308 @tab 1.797693e+308
address@hidden Quadruple-precision floating-point @tab 3.362103e-4932 @tab 
-1.189731e+4932 @tab 1.189731e+4932
 @end ifinfo
 @ifnottex
 @ifnotinfo
address@hidden Single-precision floating point (approximate) @tab 
address@hidden @tab address@hidden
address@hidden Double-precision floating point (approximate) @tab 
address@hidden @tab address@hidden
address@hidden Single-precision floating-point @tab address@hidden @tab 
address@hidden @tab address@hidden
address@hidden Double-precision floating-point @tab address@hidden @tab 
address@hidden @tab address@hidden
address@hidden Quadruple-precision floating-point @tab address@hidden @tab 
address@hidden @tab address@hidden
 @end ifnotinfo
 @end ifnottex
 @end multitable
@@ -30635,12 +30836,14 @@ You have to decide how small a delta is important to 
you. Code to do
 this looks something like the following:
 
 @example
address@hidden
 delta = 0.00001                 # for example
 difference = abs(a) - abs(b)    # subtract the two values
 if (difference < delta)
     # all ok
 else
     # not ok
address@hidden group
 @end example
 
 @noindent
@@ -31110,6 +31313,7 @@ choose to set:
 
 @example
 @c file eg/prog/pi.awk
address@hidden
 # pi.awk --- compute the digits of pi
 @c endfile
 @c endfile
@@ -31125,6 +31329,7 @@ choose to set:
 BEGIN @{
     digits = 100000
     two = 2 * 10 ^ digits
address@hidden group
     pi = two
     for (m = digits * 4; m > 0; --m) @{
         d = m * 2 + 1
@@ -32091,6 +32296,7 @@ of the function using the macro.
 For example, you might allocate a string value like so:
 
 @example
address@hidden
 awk_value_t result;
 char *message;
 const char greet[] = "Don't Panic!";
@@ -32098,8 +32304,10 @@ const char greet[] = "Don't Panic!";
 emalloc(message, char *, sizeof(greet), "myfunc");
 strcpy(message, greet);
 make_malloced_string(message, strlen(message), & result);
address@hidden group
 @end example
 
address@hidden 2
 @item #define ezalloc(pointer, type, size, message) @dots{}
 This is like @code{emalloc()}, but it calls @code{gawk_calloc()}
 instead of @code{gawk_malloc()}.
@@ -32235,6 +32443,7 @@ registering parts of your extension with @command{gawk}.
 Extension functions are described by the following record:
 
 @example
address@hidden
 typedef struct awk_ext_func @{
 @ @ @ @ const char *name;
 @ @ @ @ awk_value_t *(*const function)(int num_actual_args,
@@ -32245,6 +32454,7 @@ typedef struct awk_ext_func @{
 @ @ @ @ awk_bool_t suppress_lint;
 @ @ @ @ void *data;        /* opaque pointer to any extra state */
 @} awk_ext_func_t;
address@hidden group
 @end example
 
 The fields are:
@@ -32440,12 +32650,14 @@ Your extension should package these functions inside 
an
 @code{awk_input_parser_t}, which looks like this:
 
 @example
address@hidden
 typedef struct awk_input_parser @{
     const char *name;   /* name of parser */
     awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
     awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
     awk_const struct awk_input_parser *awk_const next;   /* for gawk */
 @} awk_input_parser_t;
address@hidden group
 @end example
 
 The fields are:
@@ -33198,6 +33410,7 @@ to a global variable or array. It is an optimization 
that
 avoids looking up variables in @command{gawk}'s symbol table every time
 access is needed. This was discussed earlier, in @ref{General Data Types}.
 
address@hidden 1500
 The following functions let you work with scalar cookies:
 
 @table @code
@@ -33260,12 +33473,14 @@ your extension's variable in @command{gawk}'s symbol 
table using
 using @code{sym_lookup()}:
 
 @example
address@hidden
 static awk_scalar_t magic_var_cookie;    /* cookie for MAGIC_VAR */
 
 static void
 my_extension_init()
 @{
     awk_value_t value;
address@hidden group
 
     /* install initial value */
     sym_update("MAGIC_VAR", make_number(42.0, & value));
@@ -33769,10 +33984,12 @@ Finally, because everything was successful, the 
function sets the
 return value to success, and returns:
 
 @example
address@hidden
     make_number(1.0, result);
 out:
     return result;
 @}
address@hidden group
 @end example
 
 Here is the output from running this part of the test:
@@ -33984,7 +34201,7 @@ BEGIN @{
 Here is the result of running the script:
 
 @example
-$ @kbd{AWKLIBPATH=$PWD ./gawk -f subarray.awk}
+$ @kbd{AWKLIBPATH=$PWD gawk -f subarray.awk}
 @print{} new_array["subarray"]["foo"] = bar
 @print{} new_array["hello"] = world
 @print{} new_array["answer"] = 42
@@ -34123,7 +34340,7 @@ It is up to the extension to decide if there are API 
incompatibilities.
 Typically, a check like this is enough:
 
 @example
-if (api->major_version != GAWK_API_MAJOR_VERSION
+if (   api->major_version != GAWK_API_MAJOR_VERSION
     || api->minor_version < GAWK_API_MINOR_VERSION) @{
         fprintf(stderr, "foo_extension: version mismatch with gawk!\n");
         fprintf(stderr, "\tmy version (%d, %d), gawk version (%d, %d)\n",
@@ -34224,10 +34441,12 @@ as described here.  The boilerplate needed is also 
provided in comments
 in the @file{gawkapi.h} header file:
 
 @example
address@hidden
 /* Boilerplate code: */
 int plugin_is_GPL_compatible;
 
 static gawk_api_t *const api;
address@hidden group
 static awk_ext_id_t ext_id;
 static const char *ext_version = NULL; /* or @dots{} = "some string" */
 
@@ -34628,10 +34847,12 @@ The second is a pointer to an @code{awk_value_t} 
structure, usually named
 @code{result}:
 
 @example
address@hidden
 /*  do_chdir --- provide dynamically loaded chdir() function for gawk */
 
 static awk_value_t *
 do_chdir(int nargs, awk_value_t *result, struct awk_ext_func *unused)
address@hidden group
 @{
     awk_value_t newdir;
     int ret = -1;
@@ -34758,7 +34979,7 @@ fill_stat_array(const char *name, awk_array_t array, 
struct stat *sbuf)
 #endif
 #ifdef S_IFDOOR /* Solaris weirdness */
         @{ S_IFDOOR, "door" @},
-#endif /* S_IFDOOR */
+#endif
     @};
     int j, k;
 @end example
@@ -34801,9 +35022,11 @@ certain members and/or the type of the file. It then 
returns zero,
 for success:
 
 @example
address@hidden
 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
     array_set_numeric(array, "blksize", sbuf->st_blksize);
-#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
+#endif
address@hidden group
 
     pmode = format_mode(sbuf->st_mode);
     array_set(array, "pmode", make_const_string(pmode, strlen(pmode),
@@ -34892,20 +35115,24 @@ Next, it gets the information for the file.  If the 
called function
 
     /* stat the file; if error, set ERRNO and return */
     ret = statfunc(name, & sbuf);
address@hidden
     if (ret < 0) @{
         update_ERRNO_int(errno);
         return make_number(ret, result);
     @}
address@hidden group
 @end example
 
 The tedious work is done by @code{fill_stat_array()}, shown
 earlier.  When done, the function returns the result from 
@code{fill_stat_array()}:
 
 @example
address@hidden
     ret = fill_stat_array(name, array, & sbuf);
 
     return make_number(ret, result);
 @}
address@hidden group
 @end example
 
 Finally, it's necessary to provide the ``glue'' that loads the
@@ -40599,14 +40826,24 @@ like this: @code{""}.
 
 Humans are used to working in decimal; i.e., base 10.  In base 10,
 numbers go from 0 to 9, and then ``roll over'' into the next
address@hidden
+column.  (Remember grade school? @math{42 = 4\times 10 + 2}.)
address@hidden iftex
address@hidden
 column.  (Remember grade school? 42 = 4 x 10 + 2.)
address@hidden ifnottex
 
 There are other number bases though.  Computers commonly use base 2
 or @dfn{binary}, base 8 or @dfn{octal}, and base 16 or @dfn{hexadecimal}.
 In binary, each column represents two times the value in the column to
 its right. Each column may contain either a 0 or a 1.
address@hidden
+Thus, binary 1010 represents @math{(1\times 8) + (0\times 4) + (1\times 2) + 
(0\times 1)}, or decimal 10.
address@hidden iftex
address@hidden
 Thus, binary 1010 represents (1 x 8) + (0 x 4) + (1 x 2)
 + (0 x 1), or decimal 10.
address@hidden ifnottex
 Octal and hexadecimal are discussed more in
 @ref{Nondecimal-numbers}.
 
@@ -40746,7 +40983,12 @@ electronic circuitry works ``naturally'' in base 2 
(just think of Off/On),
 everything inside a computer is calculated using base 2. Each digit
 represents the presence (or absence) of a power of 2 and is called a
 @dfn{bit}. So, for example, the base-two number @code{10101} is
address@hidden
+the same as decimal 21, (@math{(1\times 16) + (1\times 4) + (1\times 1)}).
address@hidden iftex
address@hidden
 the same as decimal 21, ((1 x 16) + (1 x 4) + (1 x 1)).
address@hidden ifnottex
 
 Since base-two numbers quickly become
 very long to read and write, they are usually grouped by 3 (i.e., they are
@@ -40917,7 +41159,7 @@ See also ``Interpreter.''
 @item Complemented Bracket Expression
 The negation of a @dfn{bracket expression}.  All that is @emph{not}
 described by a given bracket expression. The symbol @samp{^} precedes
-the negated bracket expression.  E.g.: @samp{[[^:digit:]}
+the negated bracket expression.  E.g.: @samp{[^[:digit:]]}
 designates whatever character is not a digit. @samp{[^bad]}
 designates whatever character is not one of the letters @samp{b}, @samp{a},
 or @samp{d}.
@@ -41186,7 +41428,12 @@ Base 16 notation, where the digits are @address@hidden 
and
 @address@hidden, with @samp{A}
 representing 10, @samp{B} representing 11, and so on, up to @samp{F} for 15.
 Hexadecimal numbers are written in C using a leading @samp{0x},
address@hidden
+to indicate their base.  Thus, @code{0x12} is 18 (@math{(1\times 16) + 2}).
address@hidden iftex
address@hidden
 to indicate their base.  Thus, @code{0x12} is 18 ((1 x 16) + 2).
address@hidden ifnottex
 @xref{Nondecimal-numbers}.
 
 @item I/O
@@ -41250,7 +41497,7 @@ meaning.  Keywords are reserved and may not be used as 
variable names.
 @code{break},
 @code{case},
 @code{continue},
address@hidden
address@hidden,
 @code{delete},
 @address@hidden,
 @code{else},
@@ -41336,7 +41583,12 @@ Ancient @command{awk} implementations used single 
precision floating-point.
 @item Octal
 Base-eight notation, where the digits are @address@hidden
 Octal numbers are written in C using a leading @samp{0},
address@hidden
+to indicate their base.  Thus, @code{013} is 11 (@math{(1\times 8) + 3}).
address@hidden iftex
address@hidden
 to indicate their base.  Thus, @code{013} is 11 ((1 x 8) + 3).
address@hidden ifnottex
 @xref{Nondecimal-numbers}.
 
 @item Output Record

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

Summary of changes:
 awklib/eg/lib/bits2str.awk  |    2 +-
 awklib/eg/prog/split.awk    |    1 -
 awklib/eg/prog/testbits.awk |    2 +-
 doc/ChangeLog               |   12 +
 doc/gawk.info               | 1084 ++++++++++++++++++++++---------------------
 doc/gawk.texi               |  312 +++++++++++--
 doc/gawktexi.in             |  310 +++++++++++--
 7 files changed, 1130 insertions(+), 593 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

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